尝试使用 String.pack 和 Lua 中的十六进制转义序列(即 \x 等效)格式将字节表示的二进制位打包成一个字节
Trying to pack binary bits represented by bytes into a byte using String.pack with Hex escaped Sequence(i.e. \x equivalent) format in Lua
我想使用 String.pack 和 Lua.But 中的十六进制转义序列(即 \x 等效)格式将字节表示的二进制位打包成一个字节 我不知道 How.Infact 我在 python 中有一个函数可以执行此操作。我也想在 Lua 中这样做但是我有问题
Lua中的函数:
MESSAGE_HEADER_FMT = ">4I"
PREFIX_VALUE = 0x000055AA
def pack_message_test():
buffer = (
struct.pack(
MESSAGE_HEADER_FMT,
PREFIX_VALUE,
2,
7,
121,
)
)
return buffer
print(pack_message_test())
python函数的输出是:
b'\x00\x00U\xaa\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00y'
然后我想用 Lua 语言做同样的事情。所以我在 Lua:
中写了这个函数
function Pack:create(fmt,ps_value,body_len)
local pack = {}
local pattern = fmt
pack.cmd = 7
pack.seqno = 2
pack.prefix_value = ps_value
pack.body_len = body_len
function pack:split()
return self.prefix_value,self.seqno,self.cmd,body_len
end
function pack:hex()
return string.pack(pattern,self:split())
end
return pack
end
pack = Pack:create(">I4",0x000055AA,121)
hex_packet = pack:hex()
Lua函数的输出是:
U¬
我想在 Lua 函数中给出与 python 函数相同的输出。
问题是什么以及如何解决?
问题是您在 lua 中的包模板做的事情与 python 中的不一样。 python 模板“>4I”将以大端字节顺序打包 4 个整数。另一方面,lua 模板 '>I4' 将按大端字节顺序打包 1 个宽度为 4 字节的 int。因此,您需要使用如下模板:'>I4I4I4I4' 将数据打包到 lua.
更新:
要像 python 那样将打包的二进制数据显示为十六进制字符串,您需要编写一个函数来执行此操作。这是一种方法:
function to_hex_string(s)
local hex = ''
local fmt = string.rep('B', #s)
for i, v in ipairs(table.pack(string.unpack(fmt, s))) do
hex = hex .. string.format("\x%02x", v)
end
return hex
end
local p = string.pack(">I4I4I4I4", 0x000055AA, 2, 7, 121)
print(to_hex_string(p))
我想使用 String.pack 和 Lua.But 中的十六进制转义序列(即 \x 等效)格式将字节表示的二进制位打包成一个字节 我不知道 How.Infact 我在 python 中有一个函数可以执行此操作。我也想在 Lua 中这样做但是我有问题 Lua中的函数:
MESSAGE_HEADER_FMT = ">4I"
PREFIX_VALUE = 0x000055AA
def pack_message_test():
buffer = (
struct.pack(
MESSAGE_HEADER_FMT,
PREFIX_VALUE,
2,
7,
121,
)
)
return buffer
print(pack_message_test())
python函数的输出是:
b'\x00\x00U\xaa\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00y'
然后我想用 Lua 语言做同样的事情。所以我在 Lua:
中写了这个函数function Pack:create(fmt,ps_value,body_len)
local pack = {}
local pattern = fmt
pack.cmd = 7
pack.seqno = 2
pack.prefix_value = ps_value
pack.body_len = body_len
function pack:split()
return self.prefix_value,self.seqno,self.cmd,body_len
end
function pack:hex()
return string.pack(pattern,self:split())
end
return pack
end
pack = Pack:create(">I4",0x000055AA,121)
hex_packet = pack:hex()
Lua函数的输出是:
U¬
我想在 Lua 函数中给出与 python 函数相同的输出。 问题是什么以及如何解决?
问题是您在 lua 中的包模板做的事情与 python 中的不一样。 python 模板“>4I”将以大端字节顺序打包 4 个整数。另一方面,lua 模板 '>I4' 将按大端字节顺序打包 1 个宽度为 4 字节的 int。因此,您需要使用如下模板:'>I4I4I4I4' 将数据打包到 lua.
更新:
要像 python 那样将打包的二进制数据显示为十六进制字符串,您需要编写一个函数来执行此操作。这是一种方法:
function to_hex_string(s)
local hex = ''
local fmt = string.rep('B', #s)
for i, v in ipairs(table.pack(string.unpack(fmt, s))) do
hex = hex .. string.format("\x%02x", v)
end
return hex
end
local p = string.pack(">I4I4I4I4", 0x000055AA, 2, 7, 121)
print(to_hex_string(p))