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

我想要一个 Lua 函数,它接受一个字符串参数。字符串包含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 中,我该如何实现注释行的功能呢?

点赞
用户3455883
用户3455883

你的字符串s中数据字节数为 #s-2 (即使是一个没有数据的字符串也有两个字节,每个字节的值为0)。如果你真的需要使用这些头字节,可以使用以下公式计算:

len = first_byte * 256 + second_byte

在 Lua 中,字节与 参考手册 中关于字符串的摘录一样:

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

这对于使用 string.* 库非常重要:

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

如果在 Lua 中使用数字的内部表示很重要,则以下 参考手册 摘录也可能是有用的:

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

换句话说,在 Lua 中不存在 2 字节的“无符号短整型” C 数据类型。整数使用“长长的”类型(8 字节有符号)存储。最后,正如lhf在评论中指出的那样,在 Lua 5.3 版本添加了按位操作,如果 he 是 the lhf,那他应该知道 ;-)

2017-04-28 09:37:41