2010-05-16 7 views
2

Ce que j'essaie de faire est d'ajouter un entier binaire dans un objet chaîne. Jusqu'à présent, j'ai ceci:Compatibilité multiplateforme typecast

int number = 5; 
cppstring.append((char*)&number, 4); 

Il fonctionne très bien sur un système x86 avec Windows, mais certaines personnes disent ses pas multiplateformes et est dangereux. Quelle est la méthode préférée pour le faire?

Répondre

3

La raison pour laquelle ce n'est pas portable est que les ints ne sont pas toujours de 4 octets. Par exemple, le modèle de données ILP64 utilise des octets de 8 octets. C99 exige seulement que les ints aient au moins 2 octets. Pourquoi avez-vous besoin de faire cela, et quel est le comportement souhaité si la taille de l'int n'est pas de 4 octets?

+0

Le contenu de l'objet chaîne doit être stocké dans un fichier de données et contenir des entiers à lire par un programme. – kaykun

+1

Ensuite, vous devrez probablement définir un entier de taille fixe pour le format de fichier et utiliser le type approprié (par exemple int32_t) dans votre programme. –

1

Il toujours travaillent habituellement, quelle que soit la plate-forme que vous êtes, si vous nous dire travailler simplement « ne pas tomber en panne ». EDIT J'ai manqué l'argument size de string::append, donc il peut réellement se bloquer ou donner des résultats bizarres à cause d'un débordement de tampon sur les plates-formes où int s ne sont pas 4 octets de long.

Cependant, vous pouvez observer des résultats différents en fonction de la taille entière et endianness de la plate-forme de votre code fonctionne sur, qui est mauvaise si vous voulez partager des fichiers créés sur une plate-forme à une autre plate-forme en cours d'exécution du même programme.

Cela dépend de ce que vous attendez de lui. Windows (généralement) fonctionne sur little-endian machines qui ont des entiers 32 bits, ce qui signifie que votre code ajoutera 05 00 00 00 à votre chaîne. Toutefois, sur big-endian machines qui ont également des entiers 32 bits, votre code ajoutera 00 00 00 05 à la chaîne. Pire, votre code pourrait fonctionner sur des plates-formes qui ont des entiers big-endian de 16 bits, qui ajouteraient 00 05.

Selon le comportement que vous voulez, il pourrait être une bonne idée de mettre en œuvre un moyen d'ajouter les octets, comme une boucle for que sait il veut ajouter 4 octets de manière peu endian « moins magique » :

int number = 5; 
for(int i = 0; i < 4; i++) 
{ 
    char numberByte = (number >> (8 * i)) & 0xFF; 
    cppstring.append(&numberByte, 1); 
} 

de cette façon, vous êtes des résultats sûrs seront compatibles sur toutes les plateformes puisque le code ne dépend ni de la taille d'un entier, ni l'ordre des octets.

+0

Il peut très probablement tomber en panne, car le type int est autorisé à être 16 bits. –