2013-10-09 65 views
1

有人可以幫助我瞭解以下內容:瞭解雙方字節順序

兩個字節順序

十六進制表示(ST UV WX YZ)表示的數值應記錄在 一個八字節的字段爲(yz wx uv st st uv wx yz)。

注意: 例如,十進制數305419896具有(12 34 56 78)作爲其十六進制 表示並記錄爲(78 56 34 12 12 34 56 78)。

這對讀取數值有什麼意義?我是否簡單地獲得32位作爲uint32,這就是所有或我需要轉換的東西,以獲得正確的價值?或者,我只從8字節字段中提取4個字節以獲取值?

編輯: 這將工作在這樣的工會嗎?

union test 
{ 
    uint64 fullValue; 
    uint8 FirstFourBytes[4]; 
    uint8 SecondFourBytes[4]; 
} 

然後我訪問SecondFourBytes數組以獲得正確的值。

+1

有了工會,陣列重疊。它們不堆疊,因此FirstFourBytes和SecondFourBytes將包含完全相同的數據。 – jmstoker

回答

4

字節順序是指組成較大數據類型(如32位整數)的單個字節存儲在內存中的順序。

傳統上,32位整數在內存中以Little Endian or Big Endian字節順序寫出,佔用4個字節(32位),但看起來像在你的情況下,協議規定整數存儲在Little Endian和Big Endian依次排列,將存儲所需的空間翻倍爲64位。

讀取時,必須考慮到該值使用8個字節,並且您可以讀取前4個字節(little endian)或最後4個字節(big endian),具體取決於哪個endianness(字節順序)您的平臺使用。

寫入時,必須序列化兩個版本,首先寫出小端表示,然後再寫出大端表示。

UPDATE 2

你的改進的合併將仍然無法工作,因爲你現在試圖在uint64大概64位數據類型和其他兩個陣列之間創建聯合,每次取4個字節(32位) 。

// this is not right 
union test 
{ 
    uint64 fullValue; 
    uint8 FirstFourBytes[4]; // this points to the first 4 bytes 
    uint8 SecondFourBytes[4]; // .. despite name, this also points to the first 4 bytes 
} 

但是,你可以使用這樣的工會:

union test 
{ 
    uint64 fullValue;    // although this is probably useless to you 
    struct Raw 
    { 
     uint8 LittleEndianBytes[4]; 
     uint8 BigEndianBytes[4]; 
    }; 
} 
+0

首先:非常感謝您的幫助。我仍然不確定是否瞭解您的代碼和我的代碼之間的區別。結構有什麼不同? – JeckyPorter

+0

啊我想我明白了。 – JeckyPorter

+0

@JeckyPorter - 不客氣。結構依次存儲兩個數組,一個接一個地存儲。聯盟更像是一個別名,用於相同的內存位置。 –