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

cod*_*der 4 arrays lua

我试图找出可以在 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);
Run Code Online (Sandbox Code Playgroud)

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

-- 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
Run Code Online (Sandbox Code Playgroud)

对示例的质量感到抱歉,但我没有任何有效的方法,也不知道如何实现这一目标......

Fen*_*ric 5

Lua 字符串被设计为保存二进制值,虽然操作字符串中的单个字符有点尴尬,因为二进制值可以在 Lua 中完成,如果您记得 Lua 字符串是不可变的并且知道 和ord方法char。例如:

tst = '012345'
print(tst)
tst = string.char(string.byte(tst, 1) + 1) .. string.sub(tst, 2)
print(tst)
Run Code Online (Sandbox Code Playgroud)

通过这种方式操作,您可以对单个角色进行任何您想要的转换。

希望这可以帮助。

其他示例

-- 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))
Run Code Online (Sandbox Code Playgroud)