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

Aus*_*tin 2 lua

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

假设数据是“abcd”
,那么字符串是 0x00 0x04 abcd

在 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
Run Code Online (Sandbox Code Playgroud)

请参阅注释行(我在 C 中会如何做)。

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

Goo*_*reg 5

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

len = first_byte * 256 + second_byte
Run Code Online (Sandbox Code Playgroud)

当谈到 Lua 中的字符串时,一个字节就是一个字节,参考手册中有关字符串的摘录清楚地表明了这一点:

string类型表示不可变的字节序列。Lua 是 8 位干净的:字符串可以包含任何 8 位值,包括嵌入的零('\0')。Lua 也是与编码无关的;它不对字符串的内容做出任何假设。

如果使用该库,这一点很重要string.*

字符串库假定一字节字符编码。

如果您的号码在 Lua 中的内部表示很重要,那么Lua 参考手册中的以下摘录可能会引起您的兴趣:

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

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

最后,正如lhf在评论中指出的那样,Lua在5.3版本中添加了按位运算,如果lhf是lhf,他应该知道;-)

  • Lua 5.3 有按位运算符。 (3认同)