天天看點

位元組序及大端序和小端序

區分大端序與小端序

先看概念:

大端序:高序位元組存儲在起始位址

小端序:低序位元組存儲在起始位址

是以區分大小端的重點在于起始位址記憶體的是高序位元組還是低序位元組。

那麼什麼是高序位元組呢 高序位元組就是值的高位

比如 十進制數字123456 那麼1就是這個值的高位, 6是這個值的低位。

弄清楚這個我們再看大小端就很容易了

我們想把0x0102這個十六進制的數存到計算機中去(0x0102轉換成二進制是0000 0001 0000 0002)

計算機有兩種存儲方式見下圖(前提: short型的大小是2位元組)

位元組序及大端序和小端序

0000 0001是我們要存儲的值的高位, 高位放在起始位址A 那麼紅框中的主機為大端序

0000 0002是我們要存儲的值的低位,低位放在起始位址A 那麼紫框中的主機為小端序

區分主機位元組序和網絡位元組序

主機位元組序指的是自己主機的位元組序。就是你自己的主機是使用大端序還是小端序。由于這兩種位元組序格式都有系統使用,是以不同的主機之間 可能A主機使用的是大端序,但是B主機使用的是小端序,這樣A和B想要通信就會出現問題,是以網絡協定必須指定一個網絡位元組序

網絡位元組順序是TCP/IP中規定好的一種資料表示格式,它與具體的CPU類型、作業系統等無關,進而可以保證資料在不同主機之間傳輸時能夠被正确解釋。網絡位元組順序采用big endian排序方式。打個不恰當的比方就像A說海南話,B說蒙古語,兩個人想要溝通必須說國語一樣。

下面得代碼可以幫助我們判斷自己得主機是大端序還是小端序

第一種方法

#include <stdio.h>
int main(void)
{
	union{
		short s;
		char c[sizeof(s)];
	} un;
	un.s = 0x0102;
	
	if(sizeof(short) == 2)	/*如果short型大小是2位元組我們就可以來驗證位元組序是怎麼存放的*/
	{
		if(un.c[0] == 1 && un.c[1] == 2)/*un.c[0] 是起始位址處,因為數組的記憶體位址是遞增的*/
			printf("big endian\n");
		else if( un.c[0] = 2 && un.c[1] == 1)
			printf("little endian\n");
		else
			printf("unknow");
	}
	else
		printf("sizeof short = %d\n", sizeof(short));
	return 0;
}
           

第二種方法

#include <stdio.h>
int main(void)
{
	int a = 0x1234;
	char *p = (char *)&a;`
	if(*p == 0x34)
		printf("little endian\n");
	else if(*p == 0x12)
		printf("big endian\n");
	else 
		printf("unknow\n");
	return 0;
}
           

繼續閱讀