如何创建并编辑二进制数据数组,以便通过UDP进行序列化?

我正在尝试弄清楚在lua中可以使用哪些存储类来按字节创建和操作二进制数据。

例如Qt有QByteArray,或c++/c有数组char(或uint8_t)。我觉得字符串不会起作用,因为我需要处理诸如0x00和其他不可打印字符之类的值。我还研究了数组,但它们似乎没有类型,我不确定如何将它们序列化。

我有点卡住了,我将尝试在下面提供代码示例:

local socket = require(\“socket \”)
- 这不起作用,只是为了展示我梦想做什么
- | len | type |负载|  
local msgData = {0x050x3A0x000xF40x04}
- 编辑部分负载
msgData [3] = 0x01
-通过UDP将其发送
udp:sendto(msgData,“127.0.0.1”,50000);

然后在另一侧,我想读取那些二进制数据:

- 这是我通常读取数据的方法,但“数据”我想只是一个字符串,如何收集二进制数据?
数据,ip,端口= udp:receivefrom()
-数据= udp:receive()
如果数据,则
  print(“RX UDP:”..数据..“-来自:”.. ip ..“:”.. port)
结束

抱歉示例的质量不太好,但我没有任何可用的东西,也不知道如何实现这一点...

点赞
用户6562353
用户6562353

Lua 字符串是为了容纳二进制值而设计的,尽管在字符串中操作单个字符有点棘手,但在 Lua 中可以将二进制值视为字符来操作,只要记住 Lua 字符串是不可变的,并且知道 ordchar 方法即可。例如:

tst = '012345'
print(tst)
tst = string.char(string.byte(tst, 1) + 1) .. string.sub(tst, 2)
print(tst)

以这种方式操作,您可以对单个字符进行任何形式的转换。

希望这有所帮助。

附加示例

-- 从十六进制值创建字符串
binstr = string.char(0x41, 0x42, 0x43, 0x00, 0x02, 0x33, 0x48)

-- 以十进制打印字节
print(string.byte(binstr, 1, string.len(binstr)))

-- 以十六进制打印值
for i = 1, string.len(binstr), 1 do
   io.write(string.format("%x ", string.byte(binstr, i)))
end
io.write("\n")

-- 打印长度
print("len = ", string.len(binstr))
2016-08-15 13:57:34