2016-04-29 3 views
1

Я пытаюсь написать специальный диссектор для Wireshark, который изменит результат байта/шестнадцатеричного на строку ASCII.Преобразование последовательности байтов в строку ASCII в lua

Я смог написать тело этого диссектора, и он работает. Моя единственная проблема заключается в преобразовании этих данных в строку 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

Нет такой функции, как split в Lua (справочное руководство по консультированию - хорошее начало). Вы должны использовать возможно string.gmatch функцию, как описано на wiki:

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

(live example)

Далее вы ищете string.char функции для преобразования байт ASCII символ.

+0

Я видел, как кто-то использовал split так же, поэтому я тоже попытался. Позже я обнаружил, что в 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 для полного списка доступных методов преобразования буфера диапазон данных для разных типов.