今天在如鵬網裡討論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() c;
c.i = 0x12345678;
return (0x12 == c.s[0]); }
// 模擬htonl函式,本機位元組序轉網路位元組序
unsigned long int htonl(unsigned long int h)
// 模擬ntohl函式,網路位元組序轉本機位元組序
unsigned long int ntohl(unsigned long int n)
// 模擬htons函式,本機位元組序轉網路位元組序
unsigned short int htons(unsigned short int h)
// 模擬ntohs函式,網路位元組序轉本機位元組序
unsigned short int ntohs(unsigned short int 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);}
C 判斷位元組續
今天在如鵬網裡討論htonl ntohl在不同機器的區別,特意模擬了htonl ntohl htons ntohs函式實現。實現如下 typedef unsigned short int uint16 typedef unsigned long int uint32 短整型大小端互換 define ...
判斷平台位元組序
方法一 利用python 2.0 以及以後版本提供了 sys.byteorder 屬性 import sys 2.0 and later if sys.byteorder little print little endian platform intel,alpha else print big e...
C語言 判斷位元組序
兩種方式儲存 大端和小端 int在32位系統中佔四個位元組,char佔乙個位元組,當對p2指標解引用時,其結果只是乙個位元組的數.在計算機中,乙個位元組 byte 佔八個位元位 位 四個位元位 bit 為乙個16進製制數,因此乙個位元組可以用兩個16進製制數表示,對p2節引用的結果就為兩個16進製制...