2016-04-29 228 views
1

Wireshark用のカスタムディセクタを作成しようとしていますが、これはバイト/ 16進数の出力をASCII文字列に変換します。luaのASCII文字列へのバイト列の変換

私はこの切開器のボディーを書くことができました。私の唯一の問題は、このデータをASCII文字列に変換することです。

Wiresharkはこのデータを一連のバイトとして宣言します。 データ型はuserdatatype(data)を使用してテスト済み)です。 tostring(data)を使用して文字列に変換するだけであれば、私のディセクタは24:50:48を返します。これは配列のバイトの正確な16進表現です。

このバイトシーケンスをasciiに直接変換する方法はありますか、このコロンで区切られた文字列をASCII文字列に変換する手助けはできますか?私はLuaに全く新しいです。私はsplit(tostring(data),":")のようなものを試してみたが、これは私がこのような何かを作成することができましたJakujeの答えを使用してLua Error: attempt to call global 'split' (a nil value)


を返します。

function isempty(s) 
    return s == nil or s == '' 
end 
data = "24:50:48:49:4A" 
s = "" 
for i in string.gmatch(data, "[^:]*") do 
    if not isempty(i) then 
     print(string.char(tonumber(i,16))) 
     s = s .. string.char(tonumber(i,16)) 
    end 
end 
print(s) 

私はこれが効果的であるかどうかわからないのですが、しかし、少なくともそれを作品)

答えて

2

Luaにはsplitというような機能はありません(参考資料は良いスタートです)。 wikiに記載されているようにあなたは、おそらくstring.gmatch機能を使用する必要があります。

data = "24:50:48" 
for i in string.gmatch(data, "[^:]*") do 
    print(i) 
end 

live example

さらにあなたはアスキー文字にバイトを変換するstring.char機能を探しています。変換バッファの使用可能なメソッドの完全なリストについては、https://wiki.wireshark.org/LuaAPI/Tvb

data:range(offset, length):string() 
-- or just call it, which works the same thanks to __call metamethod 
data(offset, length):string() 

参照TvbRangeの説明:

+0

誰かが同じ方法でスプリットを使用しているのを見たので、私も試しました。後で私はルアに分割がないことも知った:(私はあなたの道を行くようにしようとしている最初に私はstring.gmatchの空のエントリをスキップする必要があります –

+0

それは働いた、ありがとう;) –

+0

downvote 、勇敢なレンジャー? – Jakuje

2

は、あなたが興味を持っているバッファ内のバイトの範囲をマークし、あなたが望むタイプに変換する必要があり範囲データを異なるタイプに変換します。

関連する問題