Wireark解剖器在Lua - userdata

时间:2011-10-31 19:05:57

标签: string lua wireshark wireshark-dissector lua-userdata

我是Lua的新手,我正在为Wireshark建立一个定制解剖器。我的情况是这样的:

wireshark数据由十六进制数组成,例如4321 8765 CBA9。我最想知道的是(在解剖之后):CBA9 8765 4321.

到目前为止我所做的是在Lua中创建一个小函数,它将单独获取这些数字,将它们转换为字符串,并按正确顺序放置它们。

function ReverseOrder3Numbers(hex_1, hex_2, hex_3)
local hex_1_int = hex_1:uint()
local hex_2_int = hex_2:uint()
local hex_3_int = hex_3:uint()

word1 = string.format("%04X", hex_1_int)    
word2 = string.format("%04X", hex_2_int)
word3 = string.format("%04X", hex_3_int)

combined_string = "0x" .. word3 .. word2 .. word1

output = combined_string
return output

end

然而,一旦我将这一堆添加到树中,我收到一个错误,说Lua错误:...:在糟糕的自我上调用'add'(userdata expected,got string)。

我该如何解决这个问题?我完全需要一种不同的方法吗?我不是在寻找任何复杂或花哨的东西。我需要做的就是我所描述的。任何帮助,将不胜感激。

3 个答案:

答案 0 :(得分:3)

ReverseOrder3Numbers没有什么问题(除了可能缺少local个限定符之外)。您应该更新您的问题,以包含调用add的代码。

您可能不小心使用了tree.add( ... )而不是tree:add( ... )(请注意tree之后的冒号)。

答案 1 :(得分:0)

调用tree:add()将向对象'tree'发送直接链接到'tree'本身作为第一个隐式参数。无论你有多少args,你都会接受这个电话,或者根本没有人。如果您的“添加”方法不支持自我链接,请使用tree.add() sintax。在这种情况下,'self'应链接到'add'方法中的'tree'对象。

答案 2 :(得分:0)

您不清楚传递给函数ReverseOrder3Numbers的内容。但是,由于您使用uint方法访问这些参数,我假设参数为tvb:range(x,y)结果。如果要更改各个值内的数字顺序,可以使用endianess-aware方法:

function ReverseOrder3Numbers(hex_1, hex_2, hex_3)
local hex_1_int = hex_1:le_uint()
local hex_2_int = hex_2:le_uint()
local hex_3_int = hex_3:le_uint()
...
end

如果要更改添加到树中的数据的字节顺序,则应使用add方法的endianess-aware版本。

tree:le_add(f_MyProtoField, tvb:range(x,y), ReverseOrder3Numbers(...))

我不知道le在一种情况下是后缀而在另一种情况下是前缀的原因。