網路位元組序 大端 小端
1.小端法(Little-Endian)就是低位位元組排放在記憶體的低地址端(即該值的起始地址),
高位位元組排放在記憶體的高地址端;
2.大端法(Big-Endian)就是高位位元組排放在記憶體的低地址端(即該值的起始地址),
低位位元組排放在記憶體的高地址端;
網路上傳輸的資料都是位元組流,對於一個多位元組數值,在進行網路傳輸的時候,先
傳遞哪個位元組?也就是說,當接收端收到第一個位元組的時候,它將這個位元組作為高位
位元組還是低位位元組處理,是一個比較有意義的問題;
UDP/TCP/IP協議規定:把接收到的第一個位元組當作高位位元組看待,這就要求傳送
端傳送
在記憶體中的起始地址處對應的那個位元組,也就是說,該數值在記憶體中的起始地址處對應
的那個位元組就是要傳送的第一個高位位元組(即:高位位元組存放在低地址處);由此可見,多
位元組數值在傳送之前,在記憶體中應該是以大端法存放的;所以說,網路位元組序是大端位元組序;
比如,我們經過網路傳送整型數值0x12345678時,在80X86平臺中,它是以小端發存放
的,在傳送之前需要使用系統提供的位元組序轉換函式htonl()將其轉換成大端法存放的數值。
示例程式:
#include <stdio.h> #include <netinet/in.h> int main(int argc,char** argv) { int num = 0x12345678; unsigned char* pc = (unsigned char*)(&num); printf("local order:\n"); printf("[0]: 0x%X addr:%u\n", pc[0], &pc[0]); printf("[1]: 0x%X addr:%u\n", pc[1], &pc[1]); printf("[2]: 0x%X addr:%u\n", pc[2], &pc[2]); printf("[3]: 0x%X addr:%u\n", pc[3], &pc[3]); num = htonl(num); printf("htonl order:\n"); printf("[0]: 0x%X addr:%u\n", pc[0], &pc[0]); printf("[1]: 0x%X addr:%u\n", pc[1], &pc[1]); printf("[2]: 0x%X addr:%u\n", pc[2], &pc[2]); printf("[3]: 0x%X addr:%u\n", pc[3], &pc[3]); return 0; }
X86平臺上的輸出:
local order:
[0]: 0x78 addr:4289157020 //低位位元組存放在低地址處,則是小端法;
[1]: 0x56 addr:4289157021
[2]: 0x34 addr:4289157022
[3]: 0x12 addr:4289157023 //高位位元組存放在高地址處;
htonl order:
[0]: 0x12 addr:4289157020 //由此看出,主機位元組序與網路位元組不一樣;
[1]: 0x34 addr:4289157021
[2]: 0x56 addr:4289157022
[3]: 0x78 addr:4289157023