Imiter / imiter un comportement big-endian en C?

Je me demandais s’il était possible d’imiter un comportement big-endian à des fins de test?

soit par windows ou linux, mingw ou gcc. Voici un exemple de code dont j’aimerais que l’émulation retourne big endian:

#include  #include  #include  #include  #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; } 

Vous ne pouvez pas changer d’endianes à des fins de test ou quelque chose du genre. Ce que vous pouvez faire est d’installer un émulateur pour une architecture big-endian et de comstackr votre programme pour l’émulateur. Voici un moyen, sous:

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

sont des images de disque Debian pour tous les types d’architectures sockets en charge par QEMU. mips, sparc et arm sont big-endian (ne téléchargez rien se terminant 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 de la page MIPS pour télécharger une image et un fichier du kernel.

Vous pouvez maintenant démarrer dans une Debian 5 pour MIPS directement à partir de votre console. Connectez-vous à votre machine virtuelle, devenez super utilisateur (le mot de passe est “root”) et installez le compilateur C:

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

lancez un éditeur et entrez votre programme:

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

Je souhaitais une émulation big-endian sur ma machine Intel little-endian pour tester un programme relatif aux 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é Mac sur Linux à partir de http://sourceforge.net/projects/mac-on-linux/files/ et copié le fichier ‘video.x’ du téléchargement dans le répertoire ‘/ usr / share / qemu’. Cela était nécessaire pour empêcher qemu-system-ppc de s’en plaindre.

 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 téléchargée pour PowerPC et installée sur une image de disque dur 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) Amorçage de l’émulateur QEMU PowerPC avec l’image du disque dur.

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

5) Vérifié que j’étais vraiment sur un système big endian en écrivant un programme simple en C.

 susam@lilliput:~$ cat endian.c #include  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:~$ 

Au cas où vous auriez manqué le jeu de mots, les Lilliputiens étaient à l’origine des big-endians.

Vous pouvez lancer plusieurs appels hton * (Host TO Network) et ntoh * (Network TO Host) entre vos différentes utilisations. Le réseau endian est Big Endian.

16 bits: htons = Host TO Network Short ntohs = Réseau TO Host Short

32 bits: htonl = hôte sur réseau long ntohl = réseau sur hôte long

Vraiment les deux hôte à réseau et réseau à 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 sous la forme de macros et ne seront pas opérationnels sur les plates-formes utilisant le big endian.

Ils vivent dans:

 #include  

Qui est généralement disponible.

Vous pouvez également utiliser si vos bibliothèques l’ont. Avec gcc, cela nécessite -D_BSD_SOURCE

Essayez sous Unix, BSD et Linux: man htons man endian man byteorder

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

Pourquoi voudriez-vous détecter l’endianité de votre plate-forme au moment de l’exécution? Lorsque vous allez comstackr, le mode Endian est connu. Votre code fera ce que vous attendez-il… en supposant qu’un entier court correspond à 2 octets sur la plate-forme cible. Pour éviter ce blocage, vous feriez mieux de regarder le dernier octet. (octet [sizeof (short int) – 1])