2016-08-15 1 views
1

バイナリデータをバイト単位で作成および操作するためにluaで使用できるストレージクラスが何であるか把握しようとしています。UDP経由のシリアル化の準備ができているバイナリデータの配列を作成および編集するにはどうすればよいですか?

たとえば、QtにQByteArrayがあるか、またはC++/cにchar(またはuint8_t)の配列があります。 0x00やその他の印刷不可能な文字などの値を処理する必要があるため、文字列が機能するとは思われません。また、私は配列を調べましたが、型を持っているようには見えず、それらを直列化する方法がわかりません。

私はここで立ち往生少しだ、私は次のコード例をしようとします:

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

申し訳ありません:私は戻ってそのバイナリデータを読みたい他の側に続いて

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); 

を例の品質のために、私は何もしていませんが、実際にこれを達成する方法はありません...

+0

は、なぜあなたはLuaの文字列があなたのために動作しませんと思いますか?これらは明示的にバイナリデータを扱うように設計されており、Luaのドキュメントではバイナリファイルからデータを読み取るために使用されていることさえ示されています。https://www.lua.org/pil/21.2.2.html – Feneric

+0

@Feneric well ..どのように私はそれをビット操作するのですか?要素をnullまたはその他の印刷不可能な文字に変更しますか? - 私はこれの例を見つけませんでした。編集:hangon私はちょうどあなたのリンクを見た....読み込み –

+0

@大丈夫、私は私が欲しいものの一部を参照してください。しかし、私はまだ値を(例えば)0x00を位置4に追加することはできません - あるいは "文字列"の末尾に0xF3を追加することはできません...私は実際に多くの例/ドキュメントを読み込んでいますが、かなりこの情報を見つける。 (私はバイナリ文字列を自分で作っています - ファイルからの読み込みではありません) –

答えて

1

ルア文字列はバイナリ値を保持するように設計されていますが、少し厄介なindivi Lua文字列が不変であり、ordcharのメソッドを認識している場合は、バイナリ値として文字列内の2文字を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

ok、cool thanks :) - 私は今、それをやっていると思います。もし私がそうであれば、あなたの答えにもう少しの例を追加します。あなたの答えを他のものと盗みたいとは思わないでください。確かに、助けてください。 –

+0

@code_fodderあなたは何をしたいのかが分かります。 – Feneric

関連する問題