测试C++代码以实现字节序独立性

M. *_*ley 30 c++ testing endianness

如何测试或检查C++代码是否具有字节序独立性?它已经实现了,我想验证它是否适用于小端和大端平台.

我可以编写单元测试并在目标平台上运行它们,但我没有硬件.也许是模拟器?

是否可以进行编译时间检查?

Pau*_*l R 15

如果您可以访问基于x86的Mac,那么您可以利用Mac OS X内置的PowerPC仿真以及x86(小端)和PowerPC(大端)的开发人员工具支持这一事实.这使您可以在同一平台上编译和运行大端和小端可执行文件,例如

$ gcc -arch i386 foo.c -o foo_x86 # build little endian x86 executable
$ gcc -arch ppc foo.c -o foo_ppc  # build big endian PowerPC executable
Run Code Online (Sandbox Code Playgroud)

构建了big endian和little endian可执行文件之后,您可以运行任何可用的单元测试,这将捕获一些与字节序相关的问题,并且您还可以比较可执行文件生成的任何数据(文件,网络数据包,无论如何) - 这显然应该匹配.

  • @Kirill(和匿名的选民):请注意,我特意说"如果你有权访问Mac" - 有很多方法可以访问Mac进行一段时间的测试,而无需实际购买(尽管已经有了指出,廉价的二手Mac Mini在eBay上的成本非常低. (2认同)
  • 获取 Mac 最便宜的方法可能就是直接前往 Apple Store 零售店。您可以在那里试用 Mac 并编译您的东西。只要确保员工看不到您即可。:) (2认同)

Ken*_*oom 10

您可以使用qemu以相反的字节顺序设置执行环境.例如,如果您可以访问little-endian amd64或i386硬件,则可以设置qemu来模拟PowerPC Linux平台,在那里运行代码.


Lin*_*cer 5

我建议采用一种可以避免问题的编码技术。

首先,您必须了解在哪种情况下会出现字节序问题。然后要么找到一种与字节序无关的方式来编写它,要么隔离代码。

例如,可能发生字节序问题的典型问题是当您使用内存访问或联合来挑选较大值的部分时。具体来说,避免:

long x;
...
char second_byte = *(((char *)&x) + 1);
Run Code Online (Sandbox Code Playgroud)

相反,写:

long x;
...
char second_byte = (char)(x >> 8)
Run Code Online (Sandbox Code Playgroud)

连接,这是我的最爱之一,因为很多人倾向于认为你只能使用奇怪的技巧来做到这一点。不要这样做:

union uu
{
  long x;
  unsigned short s[2];
};
union uu u;
u.s[0] = low;
u.s[1] = high;
long res = u.x;       
Run Code Online (Sandbox Code Playgroud)

而是写:

long res = (((unsigned long)high) << 16) | low
Run Code Online (Sandbox Code Playgroud)