2010-09-29 7 views
0

J'ai une grande chaîne hexagonaleConvertir Hex Chaîne à Hex Valeur

abcdef... 

et je veux le convertir en

0xab 0xcd 0xef 

Y at-il des fonctions qui font ça?

Aussi pourriez-vous me dire ce que je veux dire quand les gens demandent ces entrées en ASCII ou pas? abcdef sont représentés sous la forme d'une chaîne. Je ne sais pas si c'est ASCII ou non. Je ne sais pas ce qu'ils veulent dire. Je suis très nouveau à la programmation, alors aider ici serait apprécié. J'ai une énorme chaîne que j'ai besoin d'utiliser dans mon tableau et la convertir dans le format mentionné ci-dessus va m'aider à initialiser mon tableau avec la chaîne hexadécimale.

+0

Il est difficile de comprendre ce que vous voulez dire, essayez-vous d'aller de 'char * strRep =" abcdef "' à int intRep = 11259375; '? ou Essayer d'analyser la chaîne en octets séparés? – Nate

+0

donc j'ai juste une énorme chaîne .... qui est en fait une chaîne hexagonale. donc quelque chose comme AFAB2591CFB70E77C7C417D8C389507A5 ... maintenant je veux le mettre dans un tableau d'octets comme const byte test [] {0xaf, 0xab ....}; donc je suppose que j'essaye d'analyser la grande chaîne ainsi je peux l'employer dans mon code pour initialiser un tableau d'octets. Est ce que ça aide? –

Répondre

1

Vous pouvez le faire en utilisant des flux de chaînes.

#include <iostream> 
#include <sstream> 
#include <vector> 

int main(int , char **) 
{ 
    const char *str = "AFAB2591CFB70E77C7C417D8C389507A5"; 
    const char *p1 = str; 
    const char *p2 = p1; 

    std::vector<unsigned short> output; 

    while(*p2 != NULL) { 
    unsigned short byte; 

    ++p2; 
    if(*p2 != NULL) { 
     ++p2; 
    } 

    std::stringstream sstm(std::string(p1, p2)); 

    sstm.flags(std::ios_base::hex); 
    sstm >> byte; 

    output.push_back(byte); 

    p1 += 2; 
    } 

    for(std::vector<unsigned short>::const_iterator it = output.begin(); it != output.end(); ++it) { 
    std::cout << std::hex << std::showbase << *it << "\t" << std::dec << std::noshowbase << *it << "\n"; 
    } 

    std::cout << "Press any key to continue ..."; 
    std::cin.get(); 
} 

Notez que si vous utilisez unsigned char au lieu de unsigned short la conversion des tentatives de stringstream pour le convertir en un caractère ASCII et il ne fonctionne pas.

1

Lisez chaque caractère un par un et convertissez-le en une valeur hexadécimale (ce qui est assez facile). Vous devez ensuite, avant de lire le nombre suivant, multiplier la valeur par 16 (ou, en fait, la décaler par 4) et lire le chiffre suivant avant de l'ajouter au nombre que vous avez jusqu'à présent. Continuez jusqu'à ce que vous atteigniez la fin de votre chaîne.

Quand quelqu'un demande si les entrées ils sont ASCII, ils se réfèrent à savoir si votre chaîne hexadécimale est codée en utilisant ASCII encoding. Il existe également d'autres méthodes de codage qui vont de la EBCDIC obsolète à bien plus Unicode moderne (qui a des encodages qui sont toujours tous unicode). Gardez à l'esprit que les nombres 0 à 9, a à f et A à F ont des valeurs ASCII (ou même unicode) qui sont les unes après les autres dans le codage. Donc, pour les nombres, vous pouvez calculer sa valeur REAL en faisant "character - '0'". Pour 0 cela vous donnera 0 et jusqu'à 9 il vous donnera 9 ...

+0

donc il n'y a aucune fonction existante qui fait cela en C++ je devrais faire manuellement cela? –

1

le kit de pièces dont vous avez besoin en C est

for (..,i+=2) 

et

strtoul(..,16) 
+0

J'utilise C++ comment puis-je le faire dans ce domaine? –

+0

@ user245823: Identique à C. La plupart des choses dans C fonctionnent en C++, et ce n'est pas l'une des exceptions. Si vous avez la valeur dans une chaîne C++, vous devrez l'obtenir avec la fonction membre '.c_str()' pour passer à 'strtoul', cependant. –

0

Environ les suivantes (Je voudrais pouvoir le raccourcir et utiliser des fonctions de bibliothèque, des idées?):

La fonction string_to_vector prend une chaîne de caractères et sa longueur en entrée. Il va sur la chaîne, en traitant deux caractères (str[ i ] et str[ i + 1 ]) à la fois. (Pour les valeurs impaires n, la dernière passe ne traite qu'un caractère (str[ i ] cependant.) Chaque caractère est converti en valeur numérique à l'aide de la méthode hex_char_to_int, puis il construit un nombre en "joignant" les deux valeurs numériques en les décalant et en les ajoutant. , la valeur numérique construit est ajouté à un vecteur de valeurs numériques qui est retourné à la fin de la fonction.

std::vector<unsigned> 
string_to_vector(const char * str, size_t n) { 
    std::vector<unsigned> result; 
    for(size_t i = 0; i < n; i += 2) { 
     unsigned number = hex_char_to_int(str[ i ]); // most signifcnt nibble 
     if((i + 1) < n) { 
      unsigned lsn = hex_char_to_int(str[ i + 1 ]); // least signt nibble 
      number = (number << 4) + lsn; 
     } 
     result.push_back(number); 
    } 
    return result; 
} 

la fonction suivante convertit les caractères dans la plage [0-9A-Za-z] à la valeur entière non signée correspondante.

unsigned 
hex_char_to_int(char c) { 
    unsigned result = -1; 
    if(('0' <= c) && (c <= '9')) { 
     result = c - '0'; 
    } 
    else if(('A' <= c) && (c <= 'F')) { 
     result = 10 + c - 'A'; 
    } 
    else if(('a' <= c) && (c <= 'f')) { 
     result = 10 + c - 'a'; 
    } 
    else { 
     assert(0); 
    } 
    return result; 
}