2

我目前面临一个我不知道如何避免它的问题。
我尝试处理可以是大端或小端的数据。这不是一个真正的问题,因为它总是以标头开头,因此我可以检查我必须使用哪种字节序模式,但是在解码值期间,有一些我不知道如何为大字节序数据实现的操作。
代码在小端(或以小端模式运行)的 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 差异,这些差异比恢复操作数和结果“更便宜”?

最好的问候,托拜厄斯

4

2 回答 2

4

最合乎逻辑的方法是简单地将数字转换为正确的字节顺序,然后执行计算,然后(如果需要)再次转换回来。

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

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

像这样的东西:

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

   z = x + y;

   return htonl(z);
}
于 2013-01-24T14:39:22.840 回答
0

You have two options: you can write two sets of code, one for each endianness, and try to keep track of what's going on where, or you can use a single internal representation and convert incoming and outgoing values appropriately. The latter is much simpler.

于 2013-01-24T14:42:31.710 回答