C 判斷位元組續

2021-05-24 04:42:57 字數 2132 閱讀 6907

今天在如鵬網裡討論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...