You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:20:18