大和小端的问题

时间:2010-04-06 19:31:07

标签: c++ endianness

我有以下代码:

    // 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数组,它是struct的一部分。稍后在代码中我将此数组转换为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](大端)中的数字。

我想我必须在每个循环开始时恢复到小端,但看起来应该有一种更简单的方法来做到这一点。

有什么想法吗?

谢谢,

巴比

2 个答案:

答案 0 :(得分:4)

我对端点问题的思考方式是,有数字(当它们处于机器的endian顺序时)并且存在二进制数据blob(当它们不在机器的endian顺序中时)。

当你这样想时,你意识到你不能增加二进制数据的blob(或对它们进行任何数字操作)。你可以用它们做的唯一事情就是写原始数据或将它们转换成数字。

如果要进行数字运算,数据必须是数字,因此必须采用机器的字节顺序。

答案 1 :(得分:1)

如果数据总是必须通过TCP发送到bigendian,那么将数据保留在数组中可能会更加简单,就像在bigendian顺序中一样,并且在对数据执行操作时执行字节交换。增量将从数组,byteswap(到littleEndian),increment,byteswap(bigEndian),存储到数组中读取。

相关问题