2016-04-29 316 views
1

我想爲Wireshark編寫自定義解析器,它將字節/十六進制輸出更改爲ASCII字符串。在lua中將字節序列轉換爲ASCII字符串

我能寫出這個解剖器的身體,它的工作原理。我唯一的問題是將此數據轉換爲ASCII字符串。

Wireshark聲明此數據爲字節序列。 對於Lua,數據類型爲userdata(使用type(data)進行測試)。 如果我簡單地使用tostring(data)將它轉換爲字符串,我的解剖器會返回24:50:48,這是數組中字節的確切十六進制表示形式。

有什麼辦法可以直接將這個字節序列轉換爲ascii,或者你能幫我把這個冒號分隔的字符串轉換爲ascii字符串嗎?我對Lua完全陌生。我試着像split(tostring(data),":")但這返回Lua Error: attempt to call global 'split' (a nil value)


使用Jakuje的答案,我能創造這樣的事情:

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

沒有splitLua(諮詢參考手冊是一個很好的開始)這樣的功能。作爲wiki描述,您應該使用可能string.gmatch功能:

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

live example

而且你正在尋找string.char功能字節轉換爲ASCII字符。

+0

我看到有人用同樣的方式分割,所以我也試過了。後來我發現,在Lua中沒有分裂:(我會盡力去找你的方式,首先我必須跳過string.gmatch。 –

+0

它的空白條目,謝謝;) –

+0

任何downvote的原因,勇敢的遊俠? – Jakuje

2

您需要標記在你感興趣的緩衝區的字節範圍並將其轉換成你想要的類型:

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

見TvbRange描述https://wiki.wireshark.org/LuaAPI/Tvb爲轉換緩衝的可用方法完整列表範圍數據爲不同類型。