我试图找出可以在 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)
对示例的质量感到抱歉,但我没有任何有效的方法,也不知道如何实现这一目标......
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)