我想要一个带字符串参数的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中,我如何实现注释行。
答案 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>