2010-04-06 62 views
1

我有以下代码:大端和小端的问题

// 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数组,它是一个结构的一部分。后来在我的代码这个数组转换为大端格式:

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,但事实并非如此。它将datastores.cmtDatastores.u32Region[0](大端)中的数字加到数字1(小端)上。

我想我必须在每个循环的开始时回到little endian,但它似乎应该有一个更简单的方法来做到这一点。

有什么想法?

感谢,

鲍比

回答

4

我想想端问题的方式,是有数字(当它们在机器的尾序),并有二进制数据的斑点(当他们不在机器端序中)。

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

如果您想要进行数字操作,数据必须是数字,因此必须以机器的端序排列。

1

如果数据总是需要通过TCP发送出去,那么将数据保存在数组中一如既往地以bigendian顺序进行,并且在对数据执行操作时进行字节交换可能会更简单。增量将从数组中读取,byteswap(到littleEndian),增量,byteswap(bigEndian),存储到数组。