Raspberry Pi 3 Model B:如何将字节顺序更改为 Big Endian?

Sau*_*ahu 5 gentoo arm64 raspberry-pi3 armv8

我有一个 Raspberry Pi 3 Model B,我从 32 位 Raspbian 切换到 64 位 Gentoo Linux,因为我想测试一些 64 位应用程序。现在,我想测试一个以大端顺序访问数据字节的应用程序。我知道我可以通过交换字中的字节来手动完成此操作。但我的主要问题是如何在 Raspberry Pi 上将字节顺序永久更改为大端,并且可能会在所有测试完成后再次切换回小端。任何线索将不胜感激。

Fra*_*ant 3

自从第一次看到你的问题以来,我已经阅读了很多内容,我的答案是你无法在小端 Linux 内核/发行版上执行大端 Linux 应用程序。
我什至尝试过基于Armbian的 Orangepi-PC2 aarch64 系统,该系统只是拒绝加载使用 ARM 最新的aarch64 大端工具链交叉编译的示例程序。

现在,如果您确实不想转换数据,并且性能不是问题 - 这可能不是因为您想在 Raspberry-pi 而不是 PC 上进行处理 - 我建议您:

  • 为大端 64 位平台(例如 ppc64)安装 qemu(在 Linux PC 或虚拟机上),
  • 安装 ppc64 的交叉编译器,
  • 编译您的程序并处理您的数据。

在 Ubuntu 18.04 系统上,您将执行以下命令:

sudo apt-get install gcc-8-powerpc64-linux-gnu qemu
Run Code Online (Sandbox Code Playgroud)

这是一个小例子:

创建一个包含 64 位数字的二进制文件0x1122334455667788

printf "\x11\x22\x33\x44\x55\x66\x77\x88">  example.dat
hexdump -C example.dat 
00000000  11 22 33 44 55 66 77 88                           |."3DUfw.|
00000008
Run Code Online (Sandbox Code Playgroud)

创建这个最小的、仅演示的程序:

// example.c

#include <stdio.h>
#include <stdlib.h>

int main()
{
    // demo code only - don't do this in real life...
    unsigned int value = 0;
    FILE* fp = fopen("example.dat", "rb");
    fread(&value, sizeof(value), 1, fp);
    printf("%d\n", value);
}
Run Code Online (Sandbox Code Playgroud)

编译它:

powerpc64-linux-gnu-gcc-8 -static -o example example.c
Run Code Online (Sandbox Code Playgroud)

执行它:

qemu-ppc64 ./example
0x1122334455667788
Run Code Online (Sandbox Code Playgroud)

为 x86_64 编译的相同程序将显示0x8877665544332211,这很好:

gcc -o example example.c
./example 
0x8877665544332211
Run Code Online (Sandbox Code Playgroud)

qemu-ppc64正在模拟 ppc64,但系统调用由 x86_64 linux 内核执行。我希望这有助于解决您原来的问题。