2010-04-06 59 views
1

我有以下代碼:大端和小端的問題

// Incrementer 
    datastores.cmtDatastores.u32Region[0] += 1; 

    // Decrementer 
    datastores.cmtDatastores.u32Region[1] = (datastores.cmtDatastores.u32Region[1] == 0) ? 
     10 : datastores.cmtDatastores.u32Region[1] - 1; 

    // Toggler 
    datastores.cmtDatastores.u32Region[2] = 
     (datastores.cmtDatastores.u32Region[2] == 0x0000) ? 
     0xFFFF : 0x0000; 

的u32Region陣列是一個unsigned int數組,它是一個結構的一部分。後來在我的代碼這個數組轉換爲大端格式:

unsigned long *swapL = (unsigned long*)&datastores.cmtDatastores.u32Region[50]; 
for (int i=0;i<50;i++) 
{ 
    swapL[i] = _byteswap_ulong(swapL[i]); 
} 

整個代碼段是重複的循環無限期的一部分。這是一個人爲設計的程序,增加一個元素,減少另一個元素,切換第三個元素。然後該數組通過TCP發送到另一臺機器,該機器將這些數據解包。

第一個循環正常工作。之後,由於數據採用大端格式,當我「增加」,「減少」和「切換」時,這些值不正確。顯然,如果在第一個循環datastores.cmtDatastores.u32Region[0] += 1;的結果爲1,第二個循環應該是2,但事實並非如此。它將datastores.cmtDatastores.u32Region[0](大端)中的數字加到數字1(小端)上。

我想我必須在每個循環的開始時回到little endian,但它似乎應該有一個更簡單的方法來做到這一點。

有什麼想法?

感謝,

鮑比

回答

4

我想想端問題的方式,是有數字(當它們在機器的尾序),並有二進制數據的斑點(當他們不在機器端序中)。

當你這樣想的時候,你意識到你不能增加二進制數據的blob(或者對它們進行任何數字操作)。你可以做的唯一事情就是寫入原始數據或將它們轉換爲數字。

如果您想要進行數字操作,數據必須是數字,因此必須以機器的端序排列。

1

如果數據總是需要通過TCP發送出去,那麼將數據保存在數組中一如既往地以bigendian順序進行,並且在對數據執行操作時進行字節交換可能會更簡單。增量將從數組中讀取,byteswap(到littleEndian),增量,byteswap(bigEndian),存儲到數組。