-1

我们为 x86 和 x64 平台开发了 win32 应用程序。我们想在 ARM 平台上使用相同的应用程序。ARM 平台的字节序会有所不同,即 ARM 平台通常使用大端格式。所以我们想在我们的设备应用程序中处理这个问题。

例如 // 在 x86/x64 中, int nIntVal = 0x12345678
在 ARM 中, int nIntVal = 0x78563412

如何在 ARM 中为以下数据类型存储值?

  1. 双倍的
  2. char 数组,即 char chBuffer[256]
  3. 整数64

请澄清这一点。

问候, 拉斐尔

4

4 回答 4

5

字节序仅对寄存器 <-> 内存操作很重要。

在寄存器中没有字节序。如果你把

int nIntVal = 0x12345678

在您的代码中,它将对任何字节序机器产生相同的效果。

所有 IEEE 格式 ( float, double) 在所有架构中都是相同的,所以这无关紧要。

您只需要在两种情况下关心字节顺序:

a)您将整数写入必须在两种体系结构之间传输的文件。解决方案:使用hton*, ntoh*转换器系列,使用非二进制文件格式(例如 XML)或标准化文件格式(例如 SQLite)。

b)您转换整数指针。

int a = 0x1875824715;
char b = a;
char c = *(char *)&a;
if (b == c) {
    // You are working on Little endian
}

顺便说一下,后面的代码是在运行时测试字节顺序的一种方便方法。

数组和类似的东西,如果你使用write, fwrite调用的falimies来传输它们,除非它们包含整数,否则你不会有问题:然后看上面。

int64_t: 看上面。只关心是否必须将它们二进制存储在文件中或强制转换指针。

于 2013-08-07T09:57:06.823 回答
0

在 98% 的情况下,您不需要关心字节顺序。除非你需要在不同字节序的系统之间传输一些数据,或者读/写一些字节序敏感的文件格式,否则你不应该为它烦恼。即使在这些情况下,您也可以编写代码以在任何字节顺序下编译时正确执行。

来自 Rob Pike 的“字节顺序谬误”帖子:

假设您的数据流有一个小端编码的 32 位整数。以下是如何提取它(假设无符号字节):

i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);

如果它是大端的,这里是如何提取它:

i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);

这两个片段都可以在任何机器上工作,独立于机器的字节顺序,独立于对齐问题,独立于几乎任何东西。它们是完全可移植的,给定无符号字节和 32 位整数。

于 2013-08-07T10:35:11.793 回答
0

(上面的 Sergey L. 说,你基本上不必关心字节顺序。他是对的,至少有一个例外:我假设你想将二进制数据从一个平台转换到另一个平台...... )

http://en.wikipedia.org/wiki/Endianness有一个很好的概述。

简而言之:

  • Little endian 表示,首先存储最低有效字节(在最低地址)
  • Big endian 表示首先存储最高有效字节

数组元素的存储顺序不受影响(当然是数组元素中的字节顺序)

所以

  • char 数组不变
  • int64 - 与 x86 相比,字节顺序颠倒了

关于浮点格式,请考虑http://en.wikipedia.org/wiki/Endianness#Floating-point_and_endianness。一般来说,它似乎遵循与整数格式相同的字节顺序规则,但对于较旧的 ARM 平台也有例外。(我没有这方面的第一手经验)。

一般来说,我建议先通过受控实验测试原始类型的转换。

另请考虑,编译器可能会在结构中使用不同的填充(您尚未解决的主题)。

希望这可以帮助。

于 2013-08-07T10:02:07.520 回答
0

arm 是 little endian,它有两个 big endian 变体,具体取决于架构,但最好只运行原生 little endian,那里的工具和代码量在 little endian 模式下经过更全面的测试。

如果您进行系统工程,那么字节序只是系统工程中的一个因素,一切顺利,不用担心,不用担心。为该设计定义您的接口和代码。例如,假设一个处理器字节序自动导致必须进行字节交换是一个糟糕的假设,最终会咬你。您最终将不得不交换偶数次以撤消导致交换的其他错误假设(当然,理想情况下交换 0 次,而不是 2 次或 4 次或 6 次等)。如果您在编写代码时有任何字节序问题,您应该独立编写字节序。

由于某些 ARM 具有 BE32(字不变)和较新的 arm BE8(字节不变),您将不得不做更多的工作来尝试制作一些通用的东西,同时尝试补偿 little intel、little arm、BE32 arm 和 BE8 arm。Xscale 倾向于在本地运行大端,但可以作为小端运行以减少头痛。您可能会假设因为 ARM 克隆是大端的,所以所有的都是大端,这是另一个错误的假设。

于 2013-08-07T14:31:53.803 回答