2010-07-26 33 views
16

Me preguntaba si es posible emular un comportamiento big-endian, para fines de prueba?¿Imitar/emular un comportamiento big-endian en C?

a través de windows o linux, mingw o gcc. He aquí una muestra de código que me gustaría que la emulación para volver big endian:

#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; 
} 
+0

[¿Cómo probar el código en una máquina con arquitectura big-endian?] (Http://stackoverflow.com/q/2839087/995714) –

Respuesta

19

No se puede cambiar endianes para propósitos de prueba o algo por el estilo. Lo que puedes hacer es instalar un emulador para una arquitectura big-endian y compilar tu programa para el emulador. He aquí una forma, en:

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

son imágenes de disco de Debian para todo tipo de QEMU compatibles arquitecturas. mips, sparc y arm son big-endian (no descargue nada que termine con -el). Estoy usando Debian Lenny para MIPS (http://people.debian.org/~aurel32/qemu/mips/). Instale QEMU para su plataforma, luego siga las instrucciones en la página MIPS para descargar una imagen y un archivo kernel.

Ahora puede iniciar en Debian 5 para MIPS directamente desde su consola.En la cuenta para que la máquina virtual, se convierten en superusuario (la contraseña es "raíz") e instale el compilador C:

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

fuego hasta un editor y de introducir el programa:

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

Gracias por su respuesta, todavía no me he configurado, pero supongo que debería responder a mis necesidades. –

+0

Algunas arquitecturas admiten conmutación. ppc puede compilar con '-mlittle-endian', pero es igual de inútil, ya que el programa no puede sostenerse por sí mismo. – u0b34a0f6ae

0

¿Por qué quieres para detectar el orden de bits de su plataforma en tiempo de ejecución? Cuando vaya a compilar, se conoce el modo endian. Su código hará lo que usted espera ... suponiendo que un int corto tiene 2 bytes en la plataforma de destino. Para evitar este hangup, sería mejor que miraras el último byte. (byte [sizeof (short int) - 1])

+0

Aquí hay un requisito más detallado: Tengo una utilidad que almacena datos en un archivo. los datos respetan la endianidad nativa del entorno local. Ahora quiero que esta información sea válida en un entorno diferente, lo que significa que necesita 'ajustarse' a través del indicador del entorno original. ¿Espero que tenga sentido? –

+0

Las mejores prácticas, en casos como este, usan una endianidad única para el formato de archivo, independientemente de la arquitectura del escritor. Hay métodos que te serán útiles para ayudar con esto: htons, htonl, ntohl, ntohs. ([host | network] a [host | network] [short | long]) htons tomará un breve resumen y lo convertirá en big endian, independientemente de la endianidad local nativa. ntohl tomará un endian grande y lo convertirá a su orden de bytes local. Amo estos métodos. Ellos son tus amigos. – Sniggerfardimungus

+0

Hay algunos formatos de archivo que incluyen endianness en su encabezado y tienen bibliotecas capaces de traducir, o al menos de endianness. Sin embargo, es un trabajo que hacer. – nategoose

2

Si realmente quieres hacer esto, entonces puedes usar una Mac Intel y compilar tanto para x86 como para ppc. El ejecutable de ppc se ejecutará a través de la emulación Rosetta y será big endian, mientras que la compilación x86 nativa será, por supuesto, poco endian.

+0

¿Intel Mac es un hardware? –

+0

@Doori: sí, es una Mac con una CPU Intel (a diferencia de las Mac antiguas, que tienen CPU IBM/Motorola PowerPC) –

+0

¿Alguna posibilidad de que conozca una solución basada en software? –

4

Puede lanzar un montón de llamadas hton * (Host TO Network) y ntoh * (Network TO Host) entre todos sus diferentes usos. Network endian es Big Endian.

16 bits: htons = host a la red de corto ntohs = red hasta el host corto

32 bits: htonl = anfitrión para red de larga ntohl = red hasta el host largo

Realmente tanto anfitrión de la red y la red a host son las mismas porque el mismo intercambio ocurre de cualquier manera.

Generalmente se implementan como macros y no serán operativas en plataformas que utilicen big endian.

el que viven:

#include <arpa/inet.h> 

Qué está generalmente disponible.

También puede hacer uso de <endian.h> si sus bibliotecas lo tienen. Con esto requiere gcc -D_BSD_SOURCE

En Unix, BSD y Linux intento: hombre htons hombre endian hombre byteorder

+0

Esperaba una solución "más limpia" ... una emulación que no participo activamente en la creación de roles. (para un propósito de validación más estricto) –

+0

'int output_32 (FILE * f, uint32_t x) {if (io_endian! = local_endian) {x = endian_swap32 (x); } return fwrite (& x, sizeof (uint32_t), 1, f); } ' – nategoose

5

quería grande - Emulación india en mi pequeña máquina Intel de Intel para probar un programa para problemas relacionados con órdenes de bytes. QEMU PowerPC emulator parecía una buena solución. He documentado los pasos para configurarlo a continuación.

1) QEMU instalado.

nifty:~# aptitude update && aptitude install qemu 

2) descargado Mac-on-Linux desde http://sourceforge.net/projects/mac-on-linux/files/ y copiar el archivo 'video.x' en la descarga para '/ usr/share/qemu'. Esto fue necesario para evitar que qemu-system-ppc se quejara de ello.

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) Descargué Debian para PowerPC y lo instalé en una imagen de disco duro 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) Se inició el emulador QEMU PowerPC con la imagen del disco duro.

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

5) Comprobé que estaba realmente en un sistema endian grande escribiendo un simple programa en 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]:~$ 

En caso de que te hayas perdido el juego de palabras, los liliputienses eran originalmente grandes personas endiabladas.

Cuestiones relacionadas