今天在如鵬網裡討論htonl、ntohl在不同機器的區別,特意模擬了htonl、ntohl、htons、ntohs函式實現。
實現如下:
typedef unsigned short int uint16;
typedef unsigned long int uint32;
// 短整型大小端互換
#define biglittleswap16(a) ((((uint16)(a) & 0xff00) >> 8) | /
(((uint16)(a) & 0x00ff) << 8))
// 長整型大小端互換
#define biglittleswap32(a) ((((uint32)(a) & 0xff000000) >> 24) | /
(((uint32)(a) & 0x00ff0000) >> 8) | /
(((uint32)(a) & 0x0000ff00) << 8) | /
(((uint32)(a) & 0x000000ff) << 24))
// 本機大端返回1,小端返回0
int checkcpuendian()
unionc;
c.i = 0x12345678;
return (0x12 == c.s[0]);
// 模擬htonl函式,本機位元組序轉網路位元組序
unsigned long int htonl(unsigned long int h)
// 若本機為大端,與網路位元組序同,直接返回
// 若本機為小端,轉換成大端再返回
return checkcpuendian() ? h : biglittleswap32(h);
// 模擬ntohl函式,網路位元組序轉本機位元組序
unsigned long int ntohl(unsigned long int n)
// 若本機為大端,與網路位元組序同,直接返回
// 若本機為小端,網路資料轉換成小端再返回
return checkcpuendian() ? n : biglittleswap32(n);
// 模擬htons函式,本機位元組序轉網路位元組序
unsigned short int htons(unsigned short int h)
// 若本機為大端,與網路位元組序同,直接返回
// 若本機為小端,轉換成大端再返回
return checkcpuendian() ? h : biglittleswap16(h);
// 模擬ntohs函式,網路位元組序轉本機位元組序
unsigned short int ntohs(unsigned short int n)
// 若本機為大端,與網路位元組序同,直接返回
// 若本機為小端,網路資料轉換成小端再返回
return checkcpuendian() ? n : biglittleswap16(n);
首先我們需要知道什麼是小端位元組序和大端位元組序。
考慮乙個16位整數,它由2個位元組組成。記憶體中儲存這兩個位元組有兩種方法:一種是將低序位元組儲存在低位址中,高位元組儲存在高位址中,這稱為小端位元組序(little-endian)位元組序;另一種是將高序位元組儲存在低位址中,低序位元組儲存在高位址中,這稱為大端位元組序(big-endian).
其次我們需要知道用union怎麼來查到主機的位元組序,這就需要明白union的儲存結構,那什麼是union呢,聯合(union)是一種新的資料型別,它是一種特殊的變數;
union 聯合名聯合變數名;
聯合表示幾個變數公用乙個記憶體位置,在不同的時間儲存不同的資料型別和不同長度的變數。
例如: int
main()
half;
}number;
number.i = 0x4241;
printf("%c%c/n",number.half.first,number.half.second);
return 0;
}輸出結果:
ab下面就讓我們看看用程式怎麼來檢視主機的位元組序:
#include
#include
intmain()
un;un.s = 0x0102;
if(sizeof(short) == 2)
exit(0);
}
判斷 位元組續
今天在如鵬網裡討論htonl ntohl在不同機器的區別,特意模擬了htonl ntohl htons ntohs函式實現。實現如下 typedef unsigned short int uint16 typedef unsigned long int uint32 短整型大小端互換 define ...
C語言 判斷位元組序
兩種方式儲存 大端和小端 int在32位系統中佔四個位元組,char佔乙個位元組,當對p2指標解引用時,其結果只是乙個位元組的數.在計算機中,乙個位元組 byte 佔八個位元位 位 四個位元位 bit 為乙個16進製制數,因此乙個位元組可以用兩個16進製制數表示,對p2節引用的結果就為兩個16進製制...
C 編譯期間位元組序判斷
當前常用的位元組序一般就兩種,大端序和小端序。下面列出四種位元組序的表達方式。在對應平台下,記憶體布局為的四位元組,表示為十六進製制的值就如下面 所示的。endian big 0x00010203,大端序 abcd endian little 0x03020100,小端序 dcba endian b...