一:對於一個16字節的數據,比如0x0102,在內存中可以有兩個方式來存貯。一種是0x0102,一種是0x0201,前者成為小段對其,後者成為大端對齊。
在網絡編程中,需要考慮到網絡數據的存儲順序問題,這是個很重要的問題。因為客戶機的數據存儲順是不統一好的,比如Linux,Windows用的是小段對齊,BSD,AIX等Unix系統用的時大端對齊。如果要在不同容的許同上交換數據就必須考慮這個數據格式的問題。
在Linux/Unix中,通常的數據在堆中存儲,堆的內存地址是有高到底編址的,這和棧的地址順序相反。在硬件中,一般的地址順序為,從右到左,遞增。
所以,這個大小端可以,統一為左邊為大端,右邊為小端。
所以,小段對齊,即先存儲小段數據,拿0x0102來說,的地址順序為:0102,大端對齊的地址順序為:0201.
下面有一個例子來判斷大小斷對齊:
在gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC)下結果為0:小段對齊。
二:在網絡編程中,可以使用以下函數來轉換網絡順序:
#include <netinet/in.h>
uint16_t htons(uint16_t host16bitvalue) ;
uint32_t htonl(uint32_t host32bitvalue) ;
Both return: value in network byte order
uint16_t ntohs(uint16_t net16bitvalue) ;
uint32_t ntohl(uint32_t net32bitvalue) ;
Both return: value in host byte order
n表示net(網絡順序),h表示host(本機順序),s表示short,16bit;l表示long,32bit.
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/Harry_lyc/archive/2011/04/08/6310031.aspx