大端模式與小端模式_第1頁
大端模式與小端模式_第2頁
大端模式與小端模式_第3頁
大端模式與小端模式_第4頁
大端模式與小端模式_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

大端模式與小端模式一、概念及詳解在各種體系的計算機中通常采用的字節\o"存儲"存儲機制主要有兩種:big-endian和little-endian,即大端模式和小端模式。先回顧兩個\o"關鍵詞"關鍵詞,MSB和LSB:MSB:MostSignificantBit

-------最高有效位

LSB:LeastSignificantBit-------最低有效位大端模式(big-edian)

big-endian:MSB存放在最低端的地址上。舉例,雙字節數0x1234以big-endian的方式存在起始地址0x0000\o"200"2000中:

|data|<--address

|0x12|<--0x00002000

|0x34|<--0x00002001在Big-Endian中,對于bit序列中的序號編排方式如下(以雙字節數0x8B8A為例):

----+---------------------------------------------------+

bit|0001020304050607|0809101112131415|

----+MSB---------------------------------------------LSB+

val|

1

0

0

0

1

0

1

1|

1

0

0

0

1

0

1

0|

----+---------------------------------------------------+

=0x8B8A小端模式(little-endian)little-endian:LSB存放在最低端的地址上。舉例,雙字節數0x1234以little-endian的方式存在起始地址0x00002000中:

|data|<--address

|0x34|<--0x00002000

|0x12|<--0x00002001在Little-Endian中,對于bit序列中的序號編排和Big-Endian剛好相反,其方式如下(以雙字節數0x8B8A為例):

----+---------------------------------------------------+

bit|1514131211100908|0706050403020100|

----+MSB---------------------------------------------LSB+

val|

1

0

0

0

1

0

1

1|

1

0

0

0

1

0

1

0|

----+---------------------------------------------------+

=0x8B8A二、數組在大端小端情況下的存儲:

以unsigned

\o"in"intvalue=0x12345678為例,分別看看在兩種字節序下其存儲情況,\o"我們"我們\o"可以"可以用unsignedcharbuf[4]來表示value:Big-Endian:低地址存放高位,如下:

高地址

---------------

buf[3](0x78)--低位

buf[2](0x56)

buf[1](0x34)

buf[0](0x12)--高位

---------------

低地址Little-Endian:低地址存放低位,如下:

高地址

---------------

buf[3](0x12)--高位

buf[2](0x34)

buf[1](0x56)

buf[0](0x78)--低位

--------------

低地址三、大端小端轉換\o"方法"方法:

Big-Endian轉換成Little-Endian如下:#defineBigtoLittle16(A)

((((uint16)(A)&0xff00)>>8)|\

(((uint16)(A)&0x00ff)<<8))

#defineBigtoLittle32(A)

((((uint32)(A)&0xff000000)>>24)|\

(((uint32)(A)&0x00ff0000)>>8)|\

(((uint32)(A)&0x0000ff00)<<8)|\

(((uint32)(A)&0x000000ff)<<24))四、大端小端\o"檢測"檢測方法:

如何檢查處理器是big-endian還是little-endian?\o"聯合"聯合體union的存放順序是所有成員都從低地址開始存放,利用該特性就可以輕松地獲得了CPU對內存采用Little-endian還是Big-endian模式讀寫。intcheckCPUendian()

{

union{

unsignedinta;

unsignedcharb;

}c;

c.a=1;

return(c.b==1);

}/*return1:little-endian,return0:big-endian*/網絡字節順序1、字節內的比特位不受這種順序的\o"影響"影響

比如一個字節10000000(或表示為十六進制80H)不管是什么順序其內存中的表示法都是這樣。2、大于1個字節的\o"數據"數據類型才有字節順序\o"問題"問題

比如ByteA,這個變量只有一個字節的長度,所以根據上一條沒有字節順序問題。所以字節順序是“字節之間的相對順序”的意思。3、大于1個字節的數據類型的字節順序有兩種

比如shortB,這是一個兩字節的數據類型,這時就有字節之間的相對順序問題了。網絡字節順序是“所見即所得”的順序。而Intel類型的CPU的字節順序與此相反。比如上面的shortB=0102H(十六進制,每兩位表示一個字節的寬度)。所見到的是“0102”,按一般數學常識,數軸從左到右的方向增加,即內存地址從左到右增加的話,在內存中這個shortB的字節順序是:0102這就是網絡字節順序。所見到的順序和在內存中的順序是一致的!而相反的字節順序就不同了,其在內存中的順序為:0201假設通過抓包得到網絡數據的兩個字節流為:0102如果這表示兩個Byte類型的變量,那么自然不需要考慮字節順序的問題。如果這表示一個short變量,那么就需要考慮字節順序問題。根據網絡字節順序“所見即所得”的規則,這個變量的值就是:0102假設本地\o"主機"主機是Intel類型的,那么要表示這個變量,有點麻煩:\o"定義"定義變量shortX,字節流地址為:pt,按順序讀取內存是為x=*((short*)pt);那么X的內存順序當然是0102按非“所見即所得”的規則,這個內存順序和看到的一樣顯然是不對的,所以要把這兩個字節的位置調換。調換的方法可以自己定義,但用已經有的\o"API"API還是更為方便。網絡字節順序與主機字節順序

NBO與HBO網絡字節順序NBO(\o"Network"Network

ByteOrder):按從高到低的順序存儲,在網絡上使用統一的網絡字節順序,可以\o"避免"避免兼容性問題。主機字節順序(HBO,HostByteOrder):不同的機器HBO不相同,與CPU\o"設計"設計有關計算機\o"數據存儲"數據存儲有兩種字節優先順序:高位字節優先和低位字節優先。Inter\o"net"net上數據以高位字節優先順序在網絡上傳輸,所以對于在內部是以低位字節優先方式存儲數據的機器,在Internet上傳輸數據時就需要進行轉換。

htonl()簡述:

將主機的無符號長整形數轉換成網絡字節順序。

#include<winsock.h>

u_longPASCALFARhtonl(u_longhostlong);

hostlong:主機字節順序表達的32位數。注釋:

本函數將一個32位數從主機字節順序轉換成網絡字節順序。返回值:

htonl()返回一個網絡字節順序的值。inet_ntoa()簡述:

將網絡地址轉換成“.”點隔的字符串格式。#include<winsock.h>charFAR*PASCALFARinet_ntoa(structin_addrin);in:一個表示Internet主機地址的結構。注釋:

本函數將一個用in參數所表示的Internet地址結構轉換成以“.”間隔的諸如“a.b.c.d”的字符串形式。請\o"注意"注意inet_ntoa()返回的字符串存放在WINDOWS套\o"接口"接口實現所分配的內存中。\o"應用"應用程序不應假設該內存是如何分配的。在同一個線程的下一個WINDOWS套接口調用前,數據將\o"保證"保證是有效。返回值:

若無錯誤發生,inet_ntoa()返回一個字符指針。否則的話,返回NULL。其中的數據應在下一個WINDOWS套接口調用前復制出來。網絡中傳輸的數據有的和本地字節存儲順序一致,而有的則截然不同,為了數據的一致性,就要把本地的數據轉換成網絡上使用的格式,然后發送出去,接收的時候也是一樣的,經過轉換然后才去使用這些數據,HYP

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論