使用 Lua 中的 String.pack 和 Hex 转义序列(即 \\x 等效)格式尝试将由字节表示的二进制位打包成一个字节
2022-2-27 16:36:39
收藏:0
阅读:865
评论:1
我想使用 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 函数的输出为:
U¬
我想在 Lua 函数中得到与 Python 函数相同的输出。请问问题出在哪里,应该如何解决?
原文链接 https://stackoverflow.com/questions/71281323
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
- 如何创建一个 lua 脚本以针对特定键为 fluentbit 进行限流
- 如何在Lua中将变量从Lua推送到C ++
问题在于你的 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))