如果你打算在小端字節序的機器上編寫協議棧,你就需要注意字節序的問題了。
昨天在寫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,所以就反過來了。
解決方法:讓我想想。。。