我目前面临的一个问题是我不知道如何避免它。
我尝试处理大尾数或小尾数的数据。这并不是真正的问题,因为它总是以 header 开头,因此我可以检查必须使用哪种字节序模式,但是在对值进行解码期间,有些操作我不知道如何为大字节序数据实现。
该代码在nVidia Tegra(基于ARMv7架构的Cortex-A9)上运行,它的字节序很小(或在字节序小模式下运行),但是有时我会得到较大的字节序数据。
对数据进行的大多数操作并不是真正的问题,但是我不知道如何正确进行加法操作。

Example:    D5 1B EE 96    |     96 EE 1B D5
        +   AC 84 F4 D5    | +   D5 F4 84 AC
        = 1 81 A0 E3 6B    | = 1 6C E2 A0 81

如您所见,大多数字节在结果中已经正确,但有些则不正确。它们与预期结果相差+1或-1,这是因为加法始终是从右到左(小字节顺序的机器)进行的,因此我们将进位(如果有)移到左侧。
如果在这台小端机上添加了大端,则我必须从左到右加,然后将进位(如果有)移到右边。

我现在的问题是,是否有可能(可能对处理器使用特殊的指令?)获得正确的结果?也许我可以对结果做进一步的操作,以消除这些“更便宜”的+ 1 / -1差异,而不是还原两个操作数和结果?

最好的祝福,
托比亚斯

最佳答案

最合理的方法是将数字转换为正确的字节序,然后执行计算,然后(如果需要)再次转换回原来的数字。

您当然可以使用循环来逐字节向后计算并处理进位-但它更复杂,而且我可以肯定它也不会更快,因为有更多的条件和处理器相当擅长“字节交换”。

您应该能够使用ntohlhtons网络功能来转换数字。

像这样:

int add_big_endian(int a, int b)
{
   x = ntohl(a);
   y = ntohl(b);

   z = x + y;

   return htonl(z);
}

关于c++ - 在小端机器上添加两个大端值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14503756/

10-11 16:09