尝试使用 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函数的输出是:

我想在 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))