段位、字節序在協議棧上的處理

如果你打算在小端字節序的機器上編寫協議棧,你就需要注意字節序的問題了。

昨天在寫IP報頭處理的時候遇到了這個問題。

x86是小端字節序,網絡是大端字節序。IP報頭前4位是版本號,後4位是報頭長度,那麼就是version = 0x4(IPv4),length = 0x5(報頭長20字節),網路上發過來的就是0x45,如果我們定義一個結構stA來抓取:

strruct stA

{

    unsigned char b4Version : 4;

    unsigned char b4HeadLen : 4;

};

func()

{

    ...

    stA X;

    memcpy(&X, buf, sizeof(X));    //假設buf是一個IP報文,第一個字節是0x45

    ...

}

那麼b4Version、b4HeadLen分別是什麼?

很遺憾告訴你,由於機器是小端字節序,b4Version == 0x5、b4HeadLen == 0x4!

這個結構分配段位是從低位開始的,也就是說b4Version用的是低4位,b4HeadLen用的是高4位,然而0x45即0100 0101b很明顯低4位是0101b = 5,高4位是0100b = 4,所以就反過來了。

 

解決方法:讓我想想。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值