我目前面临的一个问题是我不知道如何避免它。
我尝试处理大尾数或小尾数的数据。这并不是真正的问题,因为它总是以 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差异,而不是还原两个操作数和结果?
最好的祝福,
托比亚斯
最佳答案
最合理的方法是将数字转换为正确的字节序,然后执行计算,然后(如果需要)再次转换回原来的数字。
您当然可以使用循环来逐字节向后计算并处理进位-但它更复杂,而且我可以肯定它也不会更快,因为有更多的条件和处理器相当擅长“字节交换”。
您应该能够使用ntohl
和htons
网络功能来转换数字。
像这样:
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/