大端模式和小端模式

2021-10-24 09:16:09 字數 1686 閱讀 3644

1,在計算機中一般講位元組序分為兩類:big-endian(大端位元組序) 和 little-endian(小端位元組序)。

a) little-endian 高位位元組在前,低位位元組在後。

b) big-endian 低位位元組在前,高位位元組在後。

c) 網路位元組序:tcp/ip各層協議將位元組序定義為big-endian,因此tcp/ip協議中使用的位元組序通常稱之為網路位元組序

2,在x86的計算機中,一般採用的是小端位元組序

#include

int main()

}d is 127

d is 1

d is 0

d is 0

3,為了避免因為endianness造成的通訊問題,及便於軟體開發者編寫易於平台移植的程式,特別定義了一些c語言預處理的巨集來實現網路位元組與主機位元組次序之間的相互轉換。htons()和htonl()用來將主機位元組次序轉成網路位元組次序,前者應用於16位無符號數,後者應用於32位無符號數。linux系統中t標頭檔案是netinet/in.h,ntohs()和ntohl()實現反方向的轉換。進行轉換bsd socket提供了轉換的函式有四個:

htons 把unsigned short型別從主機序轉換到網路序

htonl 把unsigned long型別從主機序轉換到網路序

ntohs 把unsigned short型別從網路序轉換到主機序

ntohl 把unsigned long型別從網路序轉換到主機序

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)

小端模式和大端模式 大端模式和小端模式

0x123456在記憶體中的儲存方式 大端模式 低位址 小端模式 低位址 不難看出大端模式比較符合人的直觀認識 1.一開始是由於不同架構的cpu處理多個位元組資料的順序不一樣,比如x86的是小段模式,keil c51是大端模式。但是後來網際網路流行,tcp ip協議規定為大端模式,為了跨平台通訊,還...

大端模式和小端模式

大端模式和小端模式 在c語言中除了8位的char型之外,還有16 位的short型,32 位的long型 要看具體的編譯器 對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然 存在著如何將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。大端模...

大端模式和小端模式

所謂的大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址中...