在little endian机器上添加两个大端值

时间:2013-01-24 14:33:48

标签: c++ endianness armv7 tegra

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

最诚挚的问候, 托拜厄斯

2 个答案:

答案 0 :(得分:4)

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

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

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

这样的事情:

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

   z = x + y;

   return htonl(z);
}

答案 1 :(得分:0)

您有两种选择:您可以编写两组代码,一组用于每个字节序,并尝试跟踪在哪里发生的事情,或者您可以使用单个内部表示并适当地转换传入和传出值。后者要简单得多。