1.人類習(xí)慣讀寫大端字節(jié)序表牢,比如,十進(jìn)制 12345贝次,先讀高位再到低位崔兴;計算機(jī)電路先處理低位字節(jié),效率比較高,因為計算都是從低位開始的敲茄。所以位谋,計算機(jī)的內(nèi)部處理都是小端字節(jié)序。
2.計算機(jī)系統(tǒng)一般采用字節(jié)(Octet, 8 bit Byte)作為邏輯尋址單位堰燎。當(dāng)物理單位的長度大于1個字節(jié)時掏父,就要區(qū)分字節(jié)順序(Byte Order, orEndianness)。常見的字節(jié)順序有兩種:Big Endian(High-byte first)和Little Endian(Low-byte first)秆剪,常用的Intel X86(結(jié)構(gòu))平臺赊淑,以及ARM,DSP采用小端模式仅讽,而PowerPC處理器則采用了大端模式
3.從系統(tǒng)的角度理解端模式
處理器在硬件上由于端模式問題在設(shè)計中有所不同陶缺。從系統(tǒng)的角度上看,端模式問題對軟件和硬件的設(shè)計帶來了不同的影響何什,當(dāng)一個處理器系統(tǒng)中大小端模式同時存在時组哩,必須要對這些不同端模式的訪問進(jìn)行特殊的處理。
? ? ? ?PowerPC處理器主導(dǎo)網(wǎng)絡(luò)市場处渣,可以說絕大多數(shù)的通信設(shè)備都使用PowerPC處理器進(jìn)行協(xié)議處理和其他控制信息的處理伶贰,這也可能也是在網(wǎng)絡(luò)上的絕大多數(shù)協(xié)議都采用大端編址方式的原因。因此在有關(guān)網(wǎng)絡(luò)協(xié)議的軟件設(shè)計中罐栈,使用小端方式的處理器需要在軟件中處理端模式的轉(zhuǎn)變黍衙。而Pentium主導(dǎo)個人機(jī)市場,因此多數(shù)用于個人機(jī)的外設(shè)都采用小端模式荠诬,包括一些在網(wǎng)絡(luò)設(shè)備中使用的PCI總線琅翻,F(xiàn)lash等設(shè)備,這也要求在硬件設(shè)計中注意端模式的轉(zhuǎn)換柑贞。
4.常見的字節(jié)序
一般操作系統(tǒng)都是小端方椎,而通訊協(xié)議是大端的。
1)常見CPU的字節(jié)序
Big Endian : PowerPC钧嘶、IBM棠众、Sun
Little Endian : x86、DEC
ARM既可以工作在大端模式有决,也可以工作在小端模式闸拿。
2)常見文件的字節(jié)序
Adobe PS – Big Endian
BMP – Little Endian
DXF(AutoCAD) – Variable
GIF – Little Endian
JPEG – Big Endian
MacPaint – Big Endian
RTF – Little Endian
另外,Java和所有的網(wǎng)絡(luò)通訊協(xié)議都是使用Big-Endian的編碼书幕。
5.網(wǎng)絡(luò)字節(jié)序 Network Order(即大端)
TCP/IP各層協(xié)議將字節(jié)序定義為Big-Endian新荤,因此TCP/IP協(xié)議中使用的字節(jié)序通常稱之為網(wǎng)絡(luò)字節(jié)序;
主機(jī)序 Host Orader(即小端)
它遵循Little-Endian規(guī)則台汇。所以當(dāng)兩臺主機(jī)之間要通過TCP/IP協(xié)議進(jìn)行通信的時候就需要調(diào)用相應(yīng)的函數(shù)進(jìn)行主機(jī)序(Little-Endian)和網(wǎng)絡(luò)序(Big-Endian)的轉(zhuǎn)換苛骨。
htonl() ? ? //32位無符號整型的主機(jī)字節(jié)順序到網(wǎng)絡(luò)字節(jié)順序的轉(zhuǎn)換(小端->>大端)
htons() ? ? //16位無符號短整型的主機(jī)字節(jié)順序到網(wǎng)絡(luò)字節(jié)順序的轉(zhuǎn)換 ?(小端->>大端)
ntohl() ? ? //32位無符號整型的網(wǎng)絡(luò)字節(jié)順序到主機(jī)字節(jié)順序的轉(zhuǎn)換 ?(大端->>小端)
ntohs() ? ? //16位無符號短整型的網(wǎng)絡(luò)字節(jié)順序到主機(jī)字節(jié)順序的轉(zhuǎn)換 ?(大端->>小端)
6.C++怎樣判別大端小端
1.使用宏的方法:
const int endian =1;
#defineis_bigendian() ( (*(char*) &endian) == 0 )
#defineis_littlendbian() ( (*(char*) &endian) == 1 )
2.聯(lián)合體:
boolIsLittleEndian()
{
union
{????
longval;
charChar[sizeof(long)];
}u;
//????1-小端(Intel);????0-大端(Motor)
u.val?=1;
if(?u.Char[0]?==1)
{
//?小端
returntrue;
}??
elseif(?u.Char[sizeof(long)-1]?==1)
{
//?大端
returnfalse;
}?
throw("Unknown!");
7.如何手算主機(jī)字節(jié)順序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序篱瞎?
假設(shè)某16位的整數(shù),主機(jī)字節(jié)順序的值是21智袭,那么它的網(wǎng)絡(luò)字節(jié)順序是多少奔缠?
解決的步驟是:
1、將21化成二進(jìn)制吼野,二進(jìn)制,如果不足16位就在其前面補(bǔ)0两波,補(bǔ)滿16位瞳步。
21轉(zhuǎn)換成二進(jìn)制是:10101,在它前面補(bǔ)0腰奋,補(bǔ)滿16位后就得到:
00000000#00010101
2单起、將這個16位二進(jìn)制字符平分成兩段,每段8位
0000000 000010101 == > 00000000#00010101
3劣坊、顛倒這兩段的順序嘀倒,然后去掉第一個字符“1”前面的0,化成十進(jìn)制就得到了網(wǎng)絡(luò)字節(jié)順序的值了局冰。
00000000#00010101顛倒后:00010101#00000000
即00 01 01 01 00 000000
去掉第一個“1”前面的0得到:10 10 10 00 00 00 0
化成十進(jìn)制得到:5376