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的地址
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 高位 字節 高地址
所以他默認使用的是小端法,低位字節 放低地址作爲起始點.
小端法表示圖
大端法表示圖
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