2010-07-26 11 views
16

Je me demandais s'il était possible d'émuler un comportement big-endian, à des fins de test?Imiter/émuler un comportement big-endian en C?

via Windows ou Linux, MINGW ou GCC. Voici un exemple de code que je voudrais l'émulation pour revenir 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

[Comment tester votre code sur une machine avec l'architecture big-endian?] (Http://stackoverflow.com/q/2839087/995714) –

Répondre

19

Vous ne pouvez pas passer endianes à des fins de test ou quelque chose comme ça. Ce que vous pouvez faire est d'installer un émulateur pour une architecture big-endian et de compiler votre programme pour l'émulateur. Voici une façon, sous:

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

sont des images de disque Debian pour toutes sortes d'architectures supportées QEMU. mips, sparc et bras sont big-endian (ne téléchargez rien qui se termine par -el). J'utilise Debian Lenny pour MIPS (http://people.debian.org/~aurel32/qemu/mips/). Installez QEMU pour votre plate-forme, puis suivez les instructions sur la page MIPS pour télécharger une image et un fichier noyau.

Vous pouvez maintenant démarrer Debian 5 for MIPS depuis votre console.Se connecter sur votre machine virtuelle, devenir super-utilisateur (le mot de passe est « root ») et installer le compilateur C:

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

feu jusqu'à un éditeur et entrez votre programme:

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

Merci pour votre réponse, je n'ai pas encore mis en place pour le moment, mais je suppose que cela devrait répondre à mes besoins. –

+0

Certaines architectures prennent en charge la commutation. ppc peut compiler avec '-mlittle-endian', mais c'est aussi inutile, car le programme ne peut pas rester seul. – u0b34a0f6ae

0

Pourquoi voudriez-vous détecter le boutisme de votre plate-forme à l'exécution? Quand vous allez compiler, le mode endian est connu. Votre code fera ce que vous attendez de lui ... en supposant qu'un int court est de 2 octets sur la plate-forme cible. Pour éviter ce blocage, vous feriez mieux de regarder le dernier octet. (byte [sizeof (short int) - 1])

+0

Voici une exigence plus détaillée: J'ai un util qui stocke des données à un fichier. les données respectent l'endianness native de l'environnement local. Maintenant, je veux que ces données soient valides dans un environnement différent, ce qui signifie qu'il doit «s'adapter» lui-même via l'indicateur de l'environnement d'origine - j'espère que j'ai du sens? –

+0

Les meilleures pratiques, dans ce cas, utilisent une seule endianness pour le format de fichier, quelle que soit l'architecture de l'auteur. Il y a des méthodes que vous trouverez utiles pour vous aider: htons, htonl, ntohl, ntohs. ([host | network] à [host | network] [short | long]) htons prendra un court-circuit et le convertira en big endian - indépendamment de l'endianness local. ntohl prendra un grand endian et le convertira dans votre ordre des octets local. Aimez ces méthodes. Ils sont vos amis. – Sniggerfardimungus

+0

Il existe quelques formats de fichiers qui incluent l'endianness dans leur en-tête et qui ont des bibliothèques capables de traduire vers ou au moins de l'une ou l'autre des extrémités. C'est un travail à faire, cependant. – nategoose

2

Si vous voulez vraiment faire cela, alors vous pouvez utiliser un Mac Intel et construire à la fois pour x86 et ppc. L'exécutable de ppc fonctionnera via l'émulation de Rosetta et sera grand endian, alors que la construction x86 native sera bien sûr peu endian.

+0

Intel Mac est un matériel? –

+0

@Doori: oui, c'est un Mac avec un processeur Intel (par opposition aux Mac plus anciens, qui ont des processeurs IBM/Motorola PowerPC) –

+0

Avez-vous connaissance d'une solution logicielle? –

4

Vous pouvez lancer un tas d'appels hton * (Host TO Network) et ntoh * (Network TO Host) entre toutes vos utilisations. Le réseau endian est Big Endian.

16 bits: htons = Hôte de réseau court ntohs = réseau à l'hôte à court

32 bits: htonl = Hôte de réseau à long ntohl = réseau à l'hôte à long

vraiment à la fois hôte réseau et le réseau à l'hôte sont les mêmes parce que le même échange se produit de toute façon.

Ils sont généralement implémentés en tant que macros et seront non-ops sur les plates-formes qui utilisent big endian.

Ils vivent dans:

#include <arpa/inet.h> 

qui est généralement disponible. Vous pouvez également utiliser <endian.h> si vos bibliothèques l'ont. Avec gcc cela nécessite -D_BSD_SOURCE

Sur Unix, BSD et Linux essayer: homme htons homme endian homme ByteOrder

+0

J'espérais une solution "plus propre" ... une émulation que je ne joue pas activement un rôle de création. (pour une validation plus stricte) –

+0

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

5

Je voulais grand -Endulation sur mon ordinateur Intel Little-Endian pour tester un programme pour les problèmes liés à l'ordre des octets. L'émulateur QEMU PowerPC semblait être une bonne solution. J'ai documenté les étapes pour le configurer ci-dessous.

1) QEMU installé.

nifty:~# aptitude update && aptitude install qemu 

2) téléchargés Mac sur Linux à partir http://sourceforge.net/projects/mac-on-linux/files/ et copié le fichier 'video.x' dans le téléchargement de/usr/share/qemu. Cela était nécessaire pour empêcher qemu-system-ppc de s'en plaindre. 3) J'ai téléchargé Debian pour PowerPC et l'ai installé sur une image de disque dur 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) Initialisation de l'émulateur QEMU PowerPC avec l'image du disque dur.

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

5) Vérifié que j'étais vraiment sur un gros système endien en écrivant un simple programme C. Au cas où vous auriez manqué le jeu de mots, les Lilliputiens étaient à l'origine des big-endians.