2016-08-15 45 views
1

我想弄清楚我可以在lua中使用哪些存儲類來創建和操縱二進制數據逐字節。如何創建和編輯準備好通過UDP進行序列化的二進制數據數組?

例如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 

對不起對於質量的例子,但我沒有什麼可行的,並沒有真正的想法如何實現這一點...

+0

你覺得爲什麼一個Lua字符串不會爲你工作?它們被明確設計爲處理二進制數據,Lua文檔甚至顯示它們用於從二進制文件中讀取數據:https://www.lua.org/pil/21.2.2.html – Feneric

+0

@Feneric well .. 。我該如何操縱它?並將元素更改爲null或其他不可打印的字符? - 我還沒有找到任何這樣的例子。編輯:hangon我剛纔看到你的鏈接....閱讀 –

+0

@Feneric好吧,我看到了我想要的部分。然而,我仍然無法看到如何將值(例如)0x00添加到位置4 - 或在「字符串」末尾添加0xF3 ...我確實已經通讀了很多示例/文檔,但不能完全找到這個信息。 (我自己製作二進制字符串 - 不是從文件中讀取) –

回答

1

Lua字符串被設計爲保存二進制值,雖然它是一個有點尷尬操縱個人如果您記得Lua字符串是不可變的並且知道方法012a和char,則可以在Lua中完成字符串中的雙字符作爲二進制值。例如:

tst = '' 
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)) 
+0

好的,很酷,謝謝:) - 我想我現在已經掌握了它。如果可以的話,我會爲你的答案增加一些例子(不想用另一個偷你的答案)。 –

+0

@code_fodder當然,請幫助自己。你最好知道你想要做什麼。 – Feneric

相關問題