我有以下代码:
// 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(或对其进行任何数字运算)。您只能使用它们写原始数据或将它们转换为数字。
如果要执行数字运算,则数据必须是数字,因此必须以机器的字节序排列。