2010-03-01 12 views
-1

J'ai une chaîne (iso 8859-1) avec quelques caractères non ascii, une idée de comment je jette un nombre entier ou binaire?char non ascii à binaire ou entier en C++

exemple

str a ce texte: "valeur 5 = \ 377 \ 242 \ 242"

je dois transformer \ 377 \ 242 \ 242 en binaire (je l'ai essayé avec Atol ou strtol mais doesn travail't)

Merci de

+0

Comment stockez-vous cette chaîne? –

+0

const char * myString = text-> getText(). C_str(); – ger123

+0

Avec un google rapide, je ne pouvais pas trouver ISO 8959 était-ce une faute de frappe pour ISO 8859? Si oui, la table de caractères est ici: http://en.wikipedia.org/wiki/ISO_8859-1 –

Répondre

4

Les caractères sont déjà des nombres/binaire - en C, un caractère est un type entier. Ce qui peut vous dérouter, c'est que la chaîne littérale "\377\242\242" a 3 caractères, pas 12. En C, un \ suivi de 1-3 chiffres entre 0-7 est une séquence d'échappement octale.

Si vous indexez l'intro de la chaîne "\377\242\242", vous obtenez les résultats suivants (code pseudo):

"\377\242\242"[0] == 255 == '\377';

"\377\242\242"[1] == 162 == '\242';

"\377\242\242"[2] == 162 == '\242';

Jetez un oeil here pour plus de détails de caractère C littéraux.

0

Le fait que les fonctions ascii et binary soient mélangées signifie que ce n'est pas standard.
Donc vous devez jouer par les conventions: si la convention dit qu'après la chaîne "value 5 =" il y a un petit-boutiste de 4 octets entier, vous pourriez mettre un pointeur là et lancer un entier si vous travaillez sur un système little-endian.

Dans votre cas (3 octets)

int threeBytesToInt(char* p) 
{ 
    return ((unsigned int)p[0]) * (255L * 255L) + ((unsigned int)p[1]) * 255L + ((unsigned int)p[2]); 
} 

pourrait faire l'affaire compte tenu de la convention droit

Si possible, éviter ces constructions ou aller pour une convention « propre » pour minimiser les problèmes de portabilité. Dans une convention propre, le format des données binaires serait décrit dans la partie ascii.

0

Je suis confus par vos besoins. Selon la table ISO 8859, les valeurs octales 377 et 242 ne représentent pas des caractères numériques, par ex. '0' à '9'. Ainsi, en utilisant strtoul est hors de question de convertir les 3 caractères en un nombre entier.

Les valeurs octales 377, 242 et 242 représentent 3 quantités de 8 bits ou total de 24 bits. Cette quantité de bits n'est pas une puissance de 2, donc je suppose que vous ne convertissez pas tous les bits en binaire. (Bien que 24 bits soit commun pour décrire les valeurs de couleur).

Voulez-vous que les valeurs s'affichent sous forme de nombres textuels binaires, tels que '11111111' pour octal 377? Si c'est le cas, utilisez std::strtoul en utilisant 2 comme base.

Sinon, veuillez préciser vos exigences ou votre question. Donnez un exemple de fragment de programme qui montre ce que vous voulez réaliser (le pseudo code fonctionnerait aussi).