2013-08-23 35 views
-3

我試圖將dword轉換爲4字節的數組。 當我這樣做,字節似乎我的理解是一個DWORD等於在小尾數系統0x11223344會像這前後翻頁(更改端)在將dword轉換爲byte [4](endianity swap?)時出現意外結果


0000_1011___0001_0110___0010_0001____0010_1100

但是當我做這樣的:

typedef unsigned long dword; 
typedef unsigned char byte; 
int main(void) 
{ 
    dword a = 0x11223344; 
    byte b[4]; 
    memcpy(b, &a, 4); 
    printf("%x %x %x %x\n", b[0], b[1], b[2], b[3]); 
} 

我得到。
我預計它是。

同樣的事情發生在我的reinterpret_cast使用或

union 
{ 
dword a; 
byte b[4]; 
} foo; 

即時猜測我錯了,而不是編譯器/處理器,但我缺少的是在這裏嗎? 此外,如何看待大endian系統?

編輯: 所以我想我對小端系統的理解是錯誤的。 另一個問題:在仍然可移植的情況下,速度會更快:使用移位來獲取單個字節值或使用memcpy/reinterpret_cast,然後使用htonl()/ ntohl()?

+0

號碼存儲從一點小端(最低顯著年底)開始 - 印第安系統。 – avakar

+0

你甚至沒有讀過http://en.wikipedia.org/wiki/Endianness,是嗎?除此之外,在轉換爲二進制文件時,您將十六進制數視爲字節式小數...... –

+0

簡短回答:不要這樣做。或者使用適當的移位從原始字節組裝自己的值,或者使用'ntols()'(注意:不提供standard-lib)之類的運行時函數。 – WhozCraig

回答

4

不,您對little-endian的理解不正確。 Little endian表示最低有效字節位於最低內存地址處。

另外:

我的理解是一個DWORD等於在小尾數系統0x11223344看起來就像這樣:

0000 1011 0001 0110 0010 0001 0010 1100

這位模式不會有什麼關係與0x11223344在所有,無論是小端還是大端。在一個小端架構,它會讀取

0100 0100 0011 0011 0010 0010 0001 0001 

在大端系統,但是,同樣是

0001 0001 0010 0010 0011 0011 0100 0100 
+0

哎呦我把它們從十進制數11 22 33 44轉換成二進制意外。但是現在確實有道理。我一直認爲小端是相反的。大端序是更「正常」的風格,就像我們寫數字的權利? – deller

+0

@ user2712404兩者都是完全正常的。 – 2013-08-23 21:31:38

+1

考慮數字的實際解釋可能會有幫助。 I.E.如果我有0x0001美元。根據字節順序,我可能正在吃麪條,或者我可能會吃256.00美元的衝浪草坪。 –