如何创建和编辑准备好通过 UDP 序列化的二进制数据数组?

How can I create and edit an array of binary data ready for serialization over UDP?

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

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

我有点卡在这里,我将尝试在下面做一个代码示例:

local socket = require("socket")
-- this does not work, just to show what I am dreaming of doing
--              |len  |type | payload        |
local msgData = {0x05, 0x3A, 0x00, 0xF4, 0x04} 
-- edit part of the payload
msgData[3] = 0x01
-- Send it over UDP
udp:sendto(msgData, "127.0.0.1", 50000);

然后在另一边我想读回那个二进制数据:

-- This is how I normally read the data, but "data" I guess is just a string, how can I collect the binary data?
data, ip, port = udp:receivefrom()
--data = udp:receive()
if data then
  print("RX UDP: " .. data .. " - from: " .. ip .. ":" .. port)
end

对于示例的质量,我深表歉意,但我没有任何可行的方法,也不知道如何实现它...

Lua 字符串旨在保存二进制值,虽然在字符串中操作单个字符有点笨拙,因为二进制值可以在 Lua 中完成,如果您还记得 Lua 字符串是不可变的,并且知道 ordchar 方法。例如:

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

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

希望对您有所帮助。

更多示例:

-- Create a string from hex values
binstr = string.char(0x41, 0x42, 0x43, 0x00, 0x02, 0x33, 0x48)

-- print out the bytes in decimal
print(string.byte(binstr, 1, string.len(binstr)))

-- print out the hex values
for i = 1, string.len(binstr), 1 do 
   io.write(string.format("%x ", string.byte(binstr, i)))
end
io.write("\n")

--print out the length
print("len = ", string.len(binstr))