Подтвердить что ты не робот

Подражать/эмулировать поведение по-великому в C?

Мне было интересно, можно ли эмулировать поведение большого конца для целей тестирования?

через окна или 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;
}
4b9b3361

Ответ 1

Вы не можете переключать endianes для целей тестирования или что-то в этом роде. Что вы можете сделать, так это установить эмулятор для архитектуры большого конца и скомпилировать свою программу для эмулятора. Здесь один из способов:

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

- это образы дисков Debian для всех видов поддерживаемых архитектуры QEMU. mips, sparc и arm - big-endian (не загружайте ничего, оканчивающееся на -el). Я использую Debian Lenny для MIPS (http://people.debian.org/~aurel32/qemu/mips/). Установите QEMU для своей платформы, а затем следуйте инструкциям на странице MIPS, чтобы загрузить изображение и файл ядра.

Теперь вы можете загрузиться в Debian 5 для 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

Ответ 2

Мне хотелось, чтобы эмулятор my-endian Intel для эмулятора Intel для тестирования программы для вопросов, связанных с порядком байтов. Эмулятор QEMU PowerPC казался хорошим решением. Я документировал шаги, чтобы настроить его ниже.

1) Установлен QEMU.

nifty:~# aptitude update && aptitude install qemu

2) Загрузили Mac-on-Linux из http://sourceforge.net/projects/mac-on-linux/files/ и скопировали файл 'video.x' при загрузке в '/USR/доли/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 для PowerPC и установил его на образ жесткого диска QEMU.

[email protected]:~/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]
[email protected]:~/qemu$ qemu-img create powerpc.img 2G
Formatting 'powerpc.img', fmt=raw size=2147483648
[email protected]:~/qemu$ qemu-system-ppc -hda powerpc.img -cdrom debian-504-powerpc-CD-1.iso -boot d -m 512

4) Загрузите эмулятор QEMU PowerPC с изображением жесткого диска.

[email protected]:~/qemu$ qemu-system-ppc -hda powerpc.img -m 512

5) Проверено, что я действительно был в системе большого конца, написав простую программу C.

[email protected]:~$ cat endian.c
#include <stdio.h>

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

Если вы пропустили каламбур, лилипутианцы были изначально крупными.

Ответ 3

Вы можете бросить кучу hton * (Host TO Network) и ntoh * (Network To Host), которые звонят там между всеми вашими различными видами использования. Сетевой конек - большой эндиан.

16 бит: htons = Host TO Network Short ntohs = Network TO Host Short

32 бит: htonl = Host TO Network Long ntohl = Network to Host Long

Действительно, оба хоста для сети и сети для хоста одинаковы, потому что одно и то же обкатка происходит в любом случае.

Они обычно реализуются как макросы и не будут работать на платформах, которые используют большой endian.

Они живут в:

#include <arpa/inet.h> 

Что обычно доступно.

Вы также можете использовать <endian.h>, если в ваших библиотеках есть. В gcc для этого требуется -D_BSD_SOURCE

В Unix, BSD и Linux попробуйте: человек htons человек endian man byteorder

Ответ 4

Если вы действительно хотите это сделать, вы можете использовать Intel Mac и строить как для x86, так и для ppc. Исполняемый файл ppc будет запускаться через эмуляцию Rosetta и будет большой endian, в то время как встроенная сборка x86, конечно, будет немного ориентирована.

Ответ 5

Почему вы хотите определить конечность вашей платформы во время выполнения? Когда вы переходите на компиляцию, известен режим endian. Ваш код будет делать то, что вы ожидаете... предполагая, что короткий int составляет 2 байта на целевой платформе. Чтобы избежать этого зависания, вам лучше смотреть на последний байт. (byte [sizeof (short int) - 1])