gpt4 book ai didi

lua - 如何使用 Lua 将一对字节转换为带符号的 16 位整数?

转载 作者:行者123 更新时间:2023-12-04 13:39:23 37 4
gpt4 key购买 nike

我正在编写一个程序,需要将小的(最多 16 位)有符号整数序列化为二进制文件。作为其中的一部分,我需要编写一个可以将整数拆分为两个字节的函数和另一个可以将这对字节转换回原始整数的函数。

我想到的第一个想法是像解决 C 一样解决这个问题:

function dump_i16(n)
assert (-0x8000 <= n and n < 0x8000) -- 16 bit
local b1 = (n >> 8) & 0xff
local b2 = (n >> 0) & 0xff
return b1, b2
end

function read_i16(b1, b2)
assert (0 <= b1 and b1 <= 0xff) -- 8 bit
assert (0 <= b2 and b2 <= 0xff) -- 8 bit
return (b1 << 8) | (b2 << 0)
end

但是,这些函数在负数上中断,因为 Lua 整数实际上有 64 位,而我只保留低 16 位:

-- Positive numbers are OK
print( read_i16(dump_i16(17)) ) -- 17
print( read_i16(dump_i16(42)) ) -- 42

-- Negative numbers don't round trip.
print( read_i16(dump_i16(-1)) ) -- 65535 = 2^16 - 1
print( read_i16(dump_i16(-20)) ) -- 65516 = 2^16 - 20

修改我的 read_i16 函数以使其对负数正确工作的最干净的方法是什么?

如果可能的话,我更愿意使用纯 Lua 5.3 来完成此操作,而不必编写 C 代码。

最佳答案

Lua 5.3 有特殊的转换函数。

将整数 -32768..32767 转换为大端顺序长度为 2 的字符串:

local a_string = string.pack(">i2", your_integer)

要将其转换回来(正在转换“a_string”的前两个字节):

local an_integer = string.unpack(">i2", a_string)

关于lua - 如何使用 Lua 将一对字节转换为带符号的 16 位整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40943556/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com