c字節序

1. 高低字節

1一個16位(雙字節)的數據,比如0xFF1A(16進制)

那麼高位字節就是FF,低位就是1A




2. 如果是32位的數據如,0x3F68415B

高位(不是字節)3F68

低位(不是字節)415B

左邊是高位,右邊是低位




3. c語言中的高位字節和低位字節

如果用內存中的兩個字節表示一個16位的數,

0000 0000 0000 0001  最後一個他表示的範圍   1

0000 0000 0000 0010  倒數第二個他表示的範圍 2*1

0000 0000 0000 0100  倒數第三個他表示的範圍 2*2*1

以此類推


那麼其中一個字節存放最低的8位有效位,另一個存放最高的8位有效位,


存放最低的8位有效位的字節被稱爲:最低有效位字節或低位字節

存放最高的8位有效位的字節被稱爲:最高有效位字節或高位字節



      高位字節                 低位字節

↓--------------------------↓ ↓---------------------------↓           
 
15  14  13  12  11  10  9.  8.  7.  6.  5.  4.  3.  2.  1.  0. 






4. 棧的生長方向

從圖中看 a的地址是大於b的地址

IK%KR[%HN{EG(7)PUWM3CHW.png






5. 大端法和小端法

小端法: (Little-Endian) 高高  低低

低位字節放在內存低地址 即爲該值起始地址, 高位字節排放在內存的高位地址端。



大端法: (Big-Endian)  高低  低高

高位字節放在內存的低地址端即該值的其實地址, 低位字節排放在內存的高地址端。




0x12345678 在棧中

int a = 0x12345678;

printf("%x\n", *((char*)&a + 0));//78   低位 字節        低地址

printf("%x\n", *((char*)&a + 1));//56   

printf("%x\n", *((char*)&a + 2));//34

printf("%x\n", *((char*)&a + 3));//12   高位 字節       高地址

X$62_KOX9VYC{~Z]4}H}[QW.png

所以他默認使用的是小端法,低位字節 放低地址作爲起始點.





小端法表示圖 

YB{Q(OR06E1U~AN~(~ZJ]0J.png






大端法表示圖 

4R81F9_LO5I_XBE(%S4(MOG.png







6. 網絡字節序

網絡上的數據流是字節流,對於一個多字節的數值,在進行網絡傳輸的時候,應該先傳哪個字節,

當接收端收到第一個字節時候,他是將這個字節作爲高位還是低位呢?

網絡字節序的定義:收到的第一個字節被當做高位看待,這就要求發送端發送的第一個

字節就是高位, 而在發送端發送數據的時候,發送的第一個字節是該數字在內存

的其實地址對應的字節,  那這樣的話,首先要發送高位,起始地址放高位的就是:大端法。

網絡字節序說的就是   大端法字節序

如0x12345678這個×××,在X86平臺下,他默認就是小端法存放的,在發送前

需要使用API將他轉換成大端法存放,

int a = 0x12345678;
printf("%x\n", *((char*)&a+0));   78
printf("%x\n", *((char*)&a + 1));  56
printf("%x\n", *((char*)&a + 2));  34
printf("%x\n", *((char*)&a + 3));  12

//轉換成網絡字節序
a = htonl(a);

printf("%x\n", *((char*)&a + 0)); 12
printf("%x\n", *((char*)&a + 1)); 34
printf("%x\n", *((char*)&a + 2)); 56
printf("%x\n", *((char*)&a + 3)); 78









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章