使用 Lua 中的 String.pack 和 Hex 转义序列(即 \\x 等效)格式尝试将由字节表示的二进制位打包成一个字节

我想使用 Lua 中的 String.pack 和 Hex 转义序列(即 \x 等效)格式尝试将由字节表示的二进制位打包成一个字节。但我不知道该如何实现。实际上,我有一个在 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 函数的输出为:

我想在 Lua 函数中得到与 Python 函数相同的输出。请问问题出在哪里,应该如何解决?

原文链接 https://stackoverflow.com/questions/71281323

点赞
stackoverflow用户18340435
stackoverflow用户18340435

问题在于你的 Lua 包装模板与 Python 的不一样。Python 的模板,'>4I',会以大端字节序打包4个整数。而另一方面,Lua 的模板,'>I4',会以大端字节序打包一个长度为4字节的整数。因此,你需要像这样使用模板:'>I4I4I4I4' 来打包你的数据。

更新:

为了像 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))
2022-03-01 06:01:12