模仿/模仿 C 中的大端行为? [重复]

问题描述 投票:0回答:5

我想知道是否可以模拟大端行为以进行测试?

通过 windows 或 linux、mingw 或 gcc。这是一个代码示例,我希望仿真返回大端:

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

#include <limits.h>
#if CHAR_BIT != 8
#error "Unsupported char size for detecting endianness"
#endif

int main (void)
{
  short int word = 0x0001;
  char *byte = (char *) &word;
  if (byte[0]) printf("little endian");
  else printf("big endian");
  return 0;
}
c gcc mingw
5个回答
28
投票

您不能出于测试目的或类似目的而切换字节序。您可以做的是,为大端架构安装模拟器并为模拟器编译程序。这是一种方法,如下:

http://people.debian.org/~aurel32/qemu/

是适用于各种 QEMU 支持的架构的 Debian 磁盘映像。 mips、sparc 和arm 是big-endian(不要下载任何以-el 结尾的内容)。我正在使用 Debian Lenny for MIPS ( http://people.debian.org/~aurel32/qemu/mips/ )。为您的平台安装 QEMU,然后按照 MIPS 页面上的说明下载映像和内核文件。

现在您可以直接从控制台启动到 Debian 5 for MIPS。登录你的虚拟机,成为超级用户(密码是“root”)并安装C编译器:

debian-mips:~# su -
debian-mips:~# apt-get update
debian-mips:~# apt-get install gcc

启动编辑器并输入您的程序:

debian-mips:~# pico foo.c
debian-mips:~# gcc foo.c
debian-mips:~# ./a.out
big endian

更新(2021-07-27) 只是想补充一下,对于 11 年后阅读本文的任何人来说,在 docker 中使用多架构特权容器是获得测试设置的一种更简单、更快捷的方法。运行 s390x(大端)非常简单:

$ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
$ docker run --rm -it s390x/ubuntu bash

此外,这也适用于 Windows 的 Docker Desktop。

请参阅 https://github.com/multiarch/qemu-user-static 了解更多信息。


7
投票

我希望在我的小端 Intel 机器上进行大端仿真,以测试程序是否存在与字节顺序相关的问题。 QEMU PowerPC 仿真器似乎是一个不错的解决方案。我已在下面记录了设置步骤。

1) 安装QEMU。

nifty:~# aptitude update && aptitude install qemu

2) 从 http://sourceforge.net/projects/mac-on-linux/files/ 下载 Mac-on-Linux 并将下载中的“video.x”文件复制到“/usr/share/qemu” '。这是为了防止 qemu-system-ppc 抱怨它所必需的。

nifty:~# tar -xjf mol-0.9.72.1.tar.bz2
nifty:~# cp mol-0.9.72.1/mollib/drivers/video.x /usr/share/qemu

3) 下载 Debian for PowerPC 并将其安装在 QEMU 硬盘映像上。

susam@nifty:~/qemu$ wget --no-verbose http://cdimage.debian.org/debian-cd/5.0.4/powerpc/iso-cd/debian-504-powerpc-CD-1.iso
2010-06-19 02:55:06 URL:http://caesar.acc.umu.se/debian-cd/5.0.4/powerpc/iso-cd/debian-504-powerpc-CD-1.iso[675569664/675569664] -> "debian-504-powerpc-CD-1.iso" [1]
susam@nifty:~/qemu$ qemu-img create powerpc.img 2G
Formatting 'powerpc.img', fmt=raw size=2147483648
susam@nifty:~/qemu$ qemu-system-ppc -hda powerpc.img -cdrom debian-504-powerpc-CD-1.iso -boot d -m 512

4) 使用硬盘映像启动 QEMU PowerPC 模拟器。

susam@nifty:~/qemu$ qemu-system-ppc -hda powerpc.img -m 512

5)通过编写一个简单的 C 程序验证我确实在大端系统上。

susam@lilliput:~$ cat endian.c
#include <stdio.h>

int main()
{
    int n = 0x1;
    printf(*((char *) &n) ? "little-endian\n" : "big-endian\n");
    return 0;
}
susam@lilliput:~$ gcc endian.c && ./a.out
big-endian
susam@lilliput:~$ 

如果你错过了双关语,小人国最初是大尾数法。


4
投票

您可以在所有不同用途之间抛出一堆 hton*(主机到网络)和 ntoh*(网络到主机)调用。 网络字节序是大字节序。

16位: htons = 主机到网络短路 ntohs = 网络至主机短路

32 位: htonl = 主机到网络长 ntohl = 网络到主机长

实际上,主机到网络和网络到主机都是相同的,因为无论哪种方式都会发生相同的交换。

它们通常作为宏实现,并且在使用大端字节序的平台上不会执行任何操作。

他们住在:

#include <arpa/inet.h> 

一般可用。

如果您的图书馆有,您也可以使用

<endian.h>
。 对于 gcc,这需要
-D_BSD_SOURCE

在 Unix、BSD 和 Linux 上尝试: 曼顿斯 人字尾 人字节序


2
投票

如果您确实想这样做,那么您可以使用 Intel Mac 并针对 x86 和 ppc 进行构建。 ppc 可执行文件将通过 Rosetta 仿真运行,并且将是大端字节序,而本机 x86 构建当然将是小端字节序。


0
投票

为什么要在运行时检测平台的字节顺序? 当你去编译时,字节序模式是已知的。 您的代码将执行您期望的操作...假设短整型在目标平台上为 2 个字节。 为了避免这种挂起,您最好查看最后一个字节。 (字节[sizeof(short int) - 1])

© www.soinside.com 2019 - 2024. All rights reserved.