2010-10-10 17:44:58
| 分類:
c/vc/c++|舉報
|字型大小訂閱
一、大端、小端
"大端"和"小端"表示多位元組值的哪一端儲存在該值的起始位址處;小端儲存在起始位址處,即是小端位元組序;大端儲存在起始位址處,即是大端位元組序;
或者說:
1.小端法(little-endian)就是低位位元組排放在記憶體的低位址端(即該值的起始位址),高位位元組排放在記憶體的高位址端;
2.大端法(big-endian)就是高位位元組排放在記憶體的低位址端(即該值的起始位址),低位位元組排放在記憶體的高位址端;
舉個簡單的例子,對於整型資料0x12345678,它在大端法和小端法的系統中,各自的存放方式如下圖1所示:
二、網路位元組序
網路上傳輸的資料都是位元組流,對於乙個多位元組數值,在進行網路傳輸的時候,先傳遞哪個位元組?也就是說,當接收端收到第乙個位元組的時候,它將這個位元組作為高位位元組還是低位位元組處理,是乙個比較有意義的問題;
udp/tcp/ip協議規定:把接收到的第乙個位元組當作高位位元組看待,這就要求傳送端傳送的第乙個位元組是高位位元組;而在傳送端傳送資料時,傳送的第乙個位元組是該數值在記憶體中的起始位址處對應的那個位元組,也就是說,該數值在記憶體中的起始位址處對應的那個位元組就是要傳送的第乙個高位位元組(即:高位位元組存放在低位址處);由此可見,多位元組數值在傳送之前,在記憶體中因該是以大端法存放的;
所以說,網路位元組序是大端位元組序;
比如,我們經過網路傳送整型數值0x12345678時,在80x86平台中,它是以小端發存放的,在傳送之前需要使用系統提供的位元組序轉換函式htonl()將其轉換成大端法存放的數值;如下圖2所示:
三、位元組序測試
不同cpu平台上位元組序通常也不一樣,下面這個簡單的**可以測試不同平台上的位元組序:
#include
#include
int main(int argc,char** argv)
sparc平台上的輸出:
local order:
[0]: 0x12 addr:4290770212 //高位位元組存放在低位址處,則是大端法;
[1]: 0x34 addr:4290770213
[2]: 0x56 addr:4290770214
[3]: 0x78 addr:4290770215 //低位位元組存放在高位址處;
htonl order:
[0]: 0x12 addr:4290770212 //由此看出,主機位元組序與網路位元組一樣;
[1]: 0x34 addr:4290770213
[2]: 0x56 addr:4290770214
[3]: 0x78 addr:4290770215
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
intel平台上的輸出:
local order:
[0]: 0x78 addr:1245044 //低位位元組存放在低位址處,則是小端法;
[1]: 0x56 addr:1245045
[2]: 0x34 addr:1245046
[3]: 0x12 addr:1245047 //高位位元組存放在高位址處;
htonl order:
[0]: 0x12 addr:1245044 //由此看出,主機位元組序與網路位元組不一樣;
[1]: 0x34 addr:1245045
[2]: 0x56 addr:1245046
[3]: 0x78 addr:1245047
/********************************************
下面這段**可以用來測試一下你的cpu平台是大端模式還是小端模式:
********************************************/
short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低位址單元
x1=((char*)&x)[1]; //高位址單元
若x0=0x11,則是大端; 若x0=0x22,則是小端......
網路位元組序 大端 小端
1.小端法 little endian 就是低位位元組排放在記憶體的低位址端 即該值的起始位址 高位位元組排放在記憶體的高位址端 2.大端法 big endian 就是高位位元組排放在記憶體的低位址端 即該值的起始位址 低位位元組排放在記憶體的高位址端 網路上傳輸的資料都是位元組流,對於乙個多位元組...
大端 小端 網路位元組序
網路位元組序 network byte order 一般是指大端 big endian,對大部分網路傳輸協議而言 傳輸,大端小端的概念是面向多位元組資料型別的儲存方式定義的,小端就是低位在前,大端就是高位在前,其中 前 是指靠近記憶體低位址,儲存在硬碟上就是先寫那個位元組 1 首先大小端是面向多位元...
大端小端 網路位元組序
0 背景 網路上的資料流是位元組流,對於乙個多位元組數值,在進行網路傳輸的時候,先傳遞哪個位元組?也就是說,當接收端收到第乙個位元組的時候,它是將這個位元組作為高位還是低位來處理呢?1 網路位元組序定義 收到的第乙個位元組被當作高位看待,這就要求傳送端傳送的第乙個位元組應當是高位。2 網路位元組序為...