将Lua字符串的前两个字节(以bigendian格式)转换为无符号短号

时间:2017-04-28 05:55:10

标签: lua

我想要一个带字符串参数的lua函数。 String有N + 2个字节的数据。前两个字节的长度为bigendian格式,其余N个字节包含数据。

  

说数据是“abcd”
所以字符串是0x00 0x04 a b c d

在Lua函数中,这个字符串是我的输入参数。 如何计算长度最佳方式。

到目前为止,我已尝试过以下代码

function calculate_length(s)
    len = string.len(s)
    if(len >= 2) then
        first_byte = s:byte(1);
        second_byte = s:byte(2);
        //len = ((first_byte & 0xFF) << 8) or (second_byte & 0xFF)
        len = second_byte
    else
        len = 0
    end
    return len
end

参见注释行(我将如何在C中完成)。

在Lua中,我如何实现注释行。

1 个答案:

答案 0 :(得分:4)

字符串s中的数据字节数为#s-2(假设即使没有数据的字符串长度为两个字节,每个字节的值为0)。如果你真的需要使用那些头字节,你可以计算:

len = first_byte * 256 + second_byte

当谈到Lua中的字符串时,一个字节是一个字节,this excerpt about strings来自参考手册明确:

  

类型 string 表示不可变的字节序列。 Lua是8位清除:字符串可以包含任何8位值,包括嵌入的零('\ 0')。 Lua也是编码不可知的;它没有假设字符串的内容。

如果使用string.*库,这很重要:

  

字符串库假定使用单字节字符编码。

如果您的号码中Lua的内部代表很重要,则可能会对以下excerpt from the Lua Reference Manual感兴趣:

  

类型编号使用两个内部表示,或两个子类型,一个称为整数,另一个称为float。 Lua有关于何时使用每个表示的明确规则,但它也会根据需要自动转换它们....因此,程序员可以选择主要忽略整数和浮点数之间的差异,或者假设完全控制每个数字的表示形式。标准Lua使用64位整数和双精度(64位)浮点数,但您也可以编译Lua,以便它使用32位整数和/或单精度(32位)浮点数。

换句话说,Lua中不存在2字节“无符号短”C数据类型。使用“long long”类型(8字节签名)存储整数。

最后,正如lhf在评论中指出的那样,按位操作被添加到Lua in version 5.3,如果lhf是 lhf,他应该知道; - )< / p>

相关问题