2016-08-15 2 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 .. Как я могу его манипулировать? и изменить элементы на нулевые или другие непечатаемые символы? - Я не нашел примеров этого. EDIT: hangon я только что видел вашу ссылку .... чтение –

+0

@Feneric хорошо, я вижу части того, что я хочу в этом. Однако я до сих пор не вижу, как я могу добавить значение (например) 0x00 в местоположение 4 - или добавить 0xF3 в конце «строки» ... Я действительно прочитал много примеров/документов, но не могу достаточно найти эту информацию. (Я сам делаю двоичные строки - не читаю из файла) –

ответ

1

Строки Lua предназначены для хранения двоичных значений, и хотя это немного неудобно манипулировать indivi двойные символы внутри строки, поскольку двоичные значения могут быть выполнены в Lua, если вы помните, что строки Lua неизменяемы и знают о методах ord и char. Например:

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

 Смежные вопросы

  • Нет связанных вопросов^_^