1. 什麼是大小端模式?區別? (小端儲存模式和大端儲存模式)
如數字0x1234,低位元組位是0x34,高位元組位是0x12。 假設從位址0x4000處開始存放
記憶體位址 小端模式(little-endian) 大端模式(big-endian)
0x4000 0x34 0x12
0x4001 0x12 0x34
big-endina, 資料型別中的高位資料存放於記憶體的位址部分,低位資料存放於記憶體的低位址部分!
採用little-endian模式的cpu對運算元的存放方式是從低位元組到高位元組,
而big-endian模式對運算元的存放方式是從高位元組到低位元組。
計算機世界中借用大小端指「多位元組資料型別中的位元組順序」。
注:不管是大端還是小端,cpu總是從記憶體的低位到高位讀取資料
每乙個記憶體單元都是8位,對應1位元組!
2. 各自的優缺點?
沒有誰優誰劣之分,各自的優勢便是對方的劣勢!
大端模式:符號位在第一位元組,容易判斷正負!
小端模式:???
3. 大小端之分產生的原因?
大小端模式是位元組序不同......(待補充)
計算機世界中借用大小端指「多位元組資料型別中的位元組順序」。
4. 陣列在大小端模式下的儲存
以unsigned int value = 0x12345678為例,分別看看在兩種位元組序下其儲存情況,
我們可以用unsigned char buf[4]來表示value:
big-endian: 低位址存放高位,如下: little-endian: 低位址存放低位,如下:
高位址---------------
buf[3] (0x78) -- 低位 buf[3] (0x12) -- 高位
buf[2] (0x56) buf[2] (0x34)
buf[1] (0x34) buf[2] (0x34)
buf[0] (0x12) -- 高位 buf[0] (0x78) -- 低位
低位址---------------
5. 大小端模式的具體應用
比如某協議規定了資料按大端模式(big-endian)組織,而實現協議的系統是小端模式(little-endian), 那麼協議的實現**就需要對輸入資料從(big-endian)轉換為(little-endian),再進行運算, 輸出資料也要從(little-endian)轉換為(big-endian)。
在網路上傳輸資料時,由於資料傳輸的兩端可能對應不同的硬體平台,採用的儲存位元組順序也可能不一致,因此 tcp/ip 協議規定了在網路上必須採用網路位元組順序(也就是大端模式) 。
通過對大小端的儲存原理分析可發現,對於 char 型資料,由於其只佔乙個位元組,所以不存在這個問題,這也是一般情況下把資料緩衝區定義成 char 型別 的原因之一。對於 ip 位址、埠號等非 char 型資料,必須在資料傳送到網路上之前將其轉換成大端模式,在接收到資料之後再將其轉換成符合接收端主機的儲存模式。
linux
系統為大小端模式的轉換提供了 4 個函式,輸入 man byteorder 命令可得函式原型
htonl 表示 host to network long ,用於將主機 unsigned int 型資料轉換成網路位元組順序;
htons 表示 host to network short ,用於將主機 unsigned short 型資料轉換成網路位元組順序;
ntohl、ntohs 的功能分別與 htonl、htons 相反
6. 判斷本機大小端模式的方法
思路1:如乙個unsigned int a = 0x 1234; 把a轉換成unsigned char (單位元組),unsigned char *b = (unsigned char *)&a;
因為b(字串首位址,第乙個位址)表示整個字串,所以只需判斷b[0] 是否等於0x34就知是否是小端模式!
#define u16 unsigned short;
#define u8 unsigned char;
int islittleendian()
方法2:讀寫聯合體union的存放順序是所有成員都從低位址開始存放,利用該特性,可輕鬆地獲得cpu對記憶體採用little-endian還是big-endian模式
typedef enum bool;
bool isbigendian()
num;
num.a = 0x1234;
if( num.b == 0x12 )
return true;
return false; //return (num.b == 0x12);
}
7. 大小端模式之間的轉換!
(待補充)
8.常見的位元組序
一般作業系統都是小端,而通訊協議是大端的。
補:十六進製制數,以0x開始,這裡的0是數字0,不是字母o!
我們為什麼常用十六進製制數呢?計算機中所有的資料都是以二進位制的形式儲存的,有時用二進位制我們可以直觀的解決問題。
但是二進位制表示數太長,如int a = 3; 用二進位制表示 0000000 00000000 00000000 00000011 面對這麼長的數進行思考或操作,沒有人會喜歡。
因此,c,c++ 沒有提供在**直接寫二進位制數的方法。用16進製制或8進製可以解決這個問題。
大 小端模式的測試
大端模式 是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 小端模式 是指資料的低位儲存在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中。採用大端方式進行資料存放符合人類的正常思維,而採用小端方式進行資料存放利於計算機處理。到目前為止,採用大端或者小端進行資料存放,其...
大 小端模式的測試
大端模式 是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 採用大端方式進行資料存放符合人類的正常思維,而採用小端方式進行資料存放利於計算機處理。到目前為止,採用大端或者小端進行資料存放,其孰優孰劣也沒有定論。嵌入式系統開發者應該對little endian和big end...
大 小端模式的測試
大端模式 是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 採用大端方式進行資料存放符合人類的正常思維,而採用小端方式進行資料存放利於計算機處理。到目前為止,採用大端或者小端進行資料存放,其孰優孰劣也沒有定論。嵌入式系統開發者應該對little endian和big end...