我有以下代码:

    // 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 (当它们不按机器的字节序顺序排列时)。

当您这样想时,您意识到您无法递增二进制数据的blob(或对其进行任何数字运算)。您只能使用它们写原始数据或将它们转换为数字。

如果要执行数字运算,则数据必须是数字,因此必须以机器的字节序排列。

10-04 13:44