2010-01-17 5 views
1

Je ne vois pas cette option dans des choses comme sprintf().Conversion d'un Char à sa représentation Int

Comment convertir la lettre F en 255? Fondamentalement, l'opération inverse de la conversion en utilisant le format% x dans sprintf?

Je suppose que c'est quelque chose de simple qui me manque.

+5

F = 15, FF = 255 –

+0

Quelqu'un devrait renommer cela, il demande comment convertir hex un int, pas * un caractère char à sa représentation en octets * –

+0

Fixe. Merci! :) – bobber205

Répondre

3
char const* data = "F"; 
int num = int(strtol(data, 0, 16)); 

Recherchez strtol et boost::lexical_cast pour plus de détails et d'options.

3

Utilisez le format %x dans sscanf!

0

Vous ne pouvez pas obtenir (s) printf pour convertir 'F' en 255 sans magie noire. Printf convertira un caractère en d'autres représentations, mais ne changera pas sa valeur. Cela pourrait montrer comment fonctionne la conversion des caractères:

printf("Char %c is decimal %i (0x%X)\n", 'F', 'F', 'F'); 
printf("The high order bits are ignored: %d: %X -> %hhX -> %c\n", 
        0xFFFFFF46, 0xFFFFFF46, 0xFFFFFF46, 0xFFFFFF46); 

produit

Char F is decimal 70 (0x46) 
The high order bits are ignored: -186: FFFFFF46 -> 46 -> F 

Ouais, je sais que vous avez parlé sprintf, mais cela ne vous montrer quoi que ce soit jusqu'à ce que vous faire une autre impression.

L'idée est que chaque paramètre entier générique à un printf est mis sur la pile (ou dans un registre) par promotion. Cela signifie qu'il est étendu à sa taille générique la plus grande: les octets, les caractères et les shorts sont convertis en int par extension de signe ou remplissage nul. Cela maintient la liste des paramètres sur la pile dans un état raisonnable. C'est une bonne convention, mais elle a probablement son origine dans l'orientation des mots sur 16 bits de la pile sur le PDP-11 (là où tout a commencé).

Dans la bibliothèque printf (à la réception de l'appel), le code utilise le spécificateur de format pour déterminer quelle partie du paramètre (ou la totalité de celui-ci) est traitée. Donc, si le format est '% c', seulement 8 bits sont utilisés. Notez qu'il peut y avoir des variations entre les systèmes sur la façon dont les constantes hexadécimales sont «promues». Mais si une valeur supérieure à 255 est transmise à une conversion de caractères, les bits de poids fort sont ignorés.

1

La façon C++ de le faire, avec des flux:

#include <iomanip> 
#include <iostream> 
#include <sstream> 

int main() { 
    std::string hexvalue = "FF"; 
    int value; 
    // Construct an input stringstream, initialized with hexvalue 
    std::istringstream iss(hexvalue); 
    // Set the stream in hex mode, then read the value, with error handling 
    if (iss >> std::hex >> value) std::cout << value << std::endl; 
    else std::cout << "Conversion failed" << std::endl; 
} 

le programme imprime 255.

+0

Une solution pédante vérifie non seulement si la conversion a réussi, mais aussi si un drapeau a été défini (aucune donnée n'a été laissée non lue). Je l'ai laissé car même le traitement des erreurs très basique doit être suffisamment confus. – Tronic