我有以下代码:
// 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]
(大端)中的数字。
我想我必须在每个循环开始时恢复到小端,但看起来应该有一种更简单的方法来做到这一点。
有什么想法吗?
谢谢,
巴比
答案 0 :(得分:4)
我对端点问题的思考方式是,有数字(当它们处于机器的endian顺序时)并且存在二进制数据blob(当它们不在机器的endian顺序中时)。
当你这样想时,你意识到你不能增加二进制数据的blob(或对它们进行任何数字操作)。你可以用它们做的唯一事情就是写原始数据或将它们转换成数字。
如果要进行数字运算,数据必须是数字,因此必须采用机器的字节顺序。
答案 1 :(得分:1)
如果数据总是必须通过TCP发送到bigendian,那么将数据保留在数组中可能会更加简单,就像在bigendian顺序中一样,并且在对数据执行操作时执行字节交换。增量将从数组,byteswap(到littleEndian),increment,byteswap(bigEndian),存储到数组中读取。