簡體   English   中英

大尾小問題

[英]Big and Little endian question

我有以下代碼:

    // 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數組是一個無符號的int數組,它是結構的一部分。 稍后在代碼中,我將此數組轉換為Big endian格式:

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,但不是。 它將數字1(小尾數)加到datastores.cmtDatastores.u32Region[0] (大尾數)中的數字上。

我想我必須在每個循環的開始時恢復為小端字節序,但是似乎應該有一種更簡單的方法來執行此操作。

有什么想法嗎?

謝謝,

鮑比

我對字節序問題的思考方式是:有數字(當它們按機器的字節序排列時)和二進制數據的斑點(當它們不按機器的字節序順序排列時)。

當您這樣想時,您意識到您無法遞增二進制數據的blob(或對其進行任何數字運算)。 您只能使用它們寫原始數據或將它們轉換為數字。

如果要執行數字運算,則數據必須是數字,因此必須以機器的字節序排列。

如果數據始終必須是bigendian才能通過TCP發送出去,那么將數據按bigendian順序始終保留在數組中,並在對數據執行操作時進行字節交換可能會更簡單。 增量將從數組,byteswap(到littleEndian),增量,byteswap(bigEndian),存儲到數組中讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM