Wireshark Lua协议解析:摩托罗拉格式4字节纬度字段处理问询
解析摩托罗拉大端格式纬度字段的Lua代码修正
问题背景
我有一个4字节的字段,十六进制值为8020f912,该字段表示以弧度为单位的纬度,分辨率为2^-29,且采用摩托罗拉(大端)格式。正确处理逻辑应为:将该字段按大端序转换为十六进制值12f92080,转为十进制后乘以2^-29,计算后对应弧度最终约为34度。
尝试编写的Lua解析代码:
f.Lat = ProtoField.string("data.Lat", "Lat",base.dec) ... subtree:add_le(f.Lat,buffer(x,4), string.format("%f,buffer(x,4):uint()*2^-32) )
猜测uint()方法的处理方式有误,但不清楚具体该如何修正,请求指导正确的解析写法。
错误分析与修正方案
你的代码存在4处关键错误,修正如下:
- 字段类型错误:纬度是数值类型,应使用
ProtoField.double/ProtoField.float而非ProtoField.string,这样Wireshark能支持数值相关的过滤、排序操作。 - 字节序处理错误:字段是大端格式,
add_le是按小端解析,应改用add或add_be;读取整数时可明确用uint_be()指定大端序,避免歧义。 - 分辨率计算错误:需求分辨率是
2^-29,代码中误用了2^-32,导致结果偏差。 - 语法错误:
string.format的引号和括号不匹配,存在语法问题。
正确代码实现
定义字段
-- 定义双精度浮点型字段,用于存储纬度(支持弧度或角度) f.Lat = ProtoField.double("data.Lat", "Latitude", base.DEC)
解析逻辑
如果需要显示角度值(转换自弧度):
-- 按大端读取4字节无符号整数 local raw_value = buffer(x, 4):uint_be() -- 计算弧度值 local rad_value = raw_value * math.pow(2, -29) -- 转换为角度(弧度转角度公式:角度 = 弧度 * 180/π) local deg_value = math.deg(rad_value) -- 添加到解析树 subtree:add(f.Lat, buffer(x, 4), deg_value)
如果需要直接显示弧度值:
local raw_value = buffer(x, 4):uint_be() local rad_value = raw_value * math.pow(2, -29) subtree:add(f.Lat, buffer(x, 4), rad_value)
验证结果
十六进制12f92080转为十进制为310999168,乘以2^-29得到约0.5934弧度,转换为角度后约为34°,符合预期。
内容的提问来源于stack exchange,提问作者user1977050
相关产品推荐
相关产品推荐

