我是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)。
我该如何解决这个问题?我完全需要一种不同的方法吗?我不是在寻找任何复杂或花哨的东西。我需要做的就是我所描述的。任何帮助,将不胜感激。
答案 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
在一种情况下是后缀而在另一种情况下是前缀的原因。