首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将包转换为结构时出现的字节顺序问题

将包转换为结构时出现的字节顺序问题
EN

Stack Overflow用户
提问于 2013-08-29 10:47:02
回答 2查看 567关注 0票数 2

我正在使用libtrace来解析网络数据包,但我认为这是一个endian问题。

以下是Radiotap数据包的libtrace定义:

代码语言:javascript
复制
typedef struct libtrace_radiotap_t {
    uint8_t     it_version; /**< Radiotap version */
    uint8_t     it_pad; /**< Padding for natural alignment */
    uint16_t    it_len; /**< Length in bytes of the entire Radiotap header */
    uint32_t    it_present; /**< Which Radiotap fields are present */
} PACKED libtrace_radiotap_t;

因此,我将我的libtrace_packet_t转换为此Radiotap结构,并检查结果:

代码语言:javascript
复制
link = (char *) trace_get_packet_buffer(packet, &linktype, NULL);

if (linktype != TRACE_TYPE_80211_RADIO)
    return;

rtap = (libtrace_radiotap_t *) link;

printf("%d %d %d %d\n", rtap->it_present, rtap->it_pad, rtap->it_len,
       rtap->it_present);

在我的开发机器上,来自我的pcap文件中的包的Radiotap数据是:

代码语言:javascript
复制
806959 0 72 806959

这是正确的。我的开发机器正在成功地解析我希望从pcap文件中看到的数据。

当在我的生产机器上运行时,我看到了不同的值:

代码语言:javascript
复制
793775104 0 18432 793775104

相同pcap文件中的相同数据包。不同的Radiotap值。我怀疑问题出在两台机器的字节顺序不同上。然而,rtap.it_version是一个uint8_t,它是单字节的,不应该受到endian问题的影响,不是吗?

EN

回答 2

Stack Overflow用户

发布于 2013-08-29 11:42:42

这应该是一个字节序问题。对于72,十六进制是0x48,它是一个uint16_t,所以在不同的字节顺序中是0x4800 = 18432。没错。对于806959 = 0xC502F,在不同的字节顺序中为0x2F50C000 = 793775104。

这可能会有所帮助:

代码语言:javascript
复制
#define T(x) (((x&0xff)<<24)|((x&0xff00)<<8)|((x&0xff0000)>>8)|((x&0xff000000)>>24))
票数 1
EN

Stack Overflow用户

发布于 2013-08-30 06:12:43

libtrace返回的头结构指向出现在"wire“上的头,即不尝试转换为主机字节顺序。

Radiotap报头字段始终是小端的(与传统的网络字节顺序相反,传统的网络字节顺序是大端的),因此如果您要尝试手动解析报头,则需要对此进行补偿。仅仅使用ntohl是行不通的,因为这需要您转换的值是大端的。

然而,一种更好的方法是使用内置的libtrace函数来访问各种无线电抽头字段,例如trace_get_wireless_ratetrace_get_wireless_signal_strength_dbm和许多其他字段。这些函数将根据您的主机架构进行字节顺序转换,因此您不必担心。

至于你对struct ieee80211_frame_control的问题,这看起来像是一个bug。我推荐filing a bug ticket with the libtrace developers

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18501516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档