2009-03-08 9 views
14

Voici ce que j'ai actuellement jusqu'à présent:Comment écrire les valeurs hexadécimales d'un caractère en ASCII dans un fichier texte?

void WriteHexToFile(std::ofstream &stream, void *ptr, int buflen, char *prefix) 
{ 
    unsigned char *buf = (unsigned char*)ptr; 

    for(int i = 0; i < buflen; ++i) { 
     if(i % 16 == 0) { 
      stream << prefix; 
     } 

     stream << buf[i] << ' '; 
    } 
} 

J'ai essayé de faire stream.hex, stream.setf (std :: ios :: hexagonaux), ainsi que la recherche Google pour un peu. J'ai également essayé:

stream << stream.hex << (int)buf[i] << ' '; 

Mais cela ne semble pas fonctionner non plus.

Voici un exemple d'une sortie qu'elle produit actuellement:

Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í 
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í 
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í 
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í 
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í 
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í 

Je voudrais que la sortie ressemble à ce qui suit:

FF EE DD CC BB AA 99 88 77 66 55 44 33 22 11 00 
FF EE DD CC BB AA 99 88 77 66 55 44 33 22 11 00 
FF EE DD CC BB AA 99 88 77 66 55 44 33 22 11 00 
FF EE DD CC BB AA 99 88 77 66 55 44 33 22 11 00 
FF EE DD CC BB AA 99 88 77 66 55 44 33 22 11 00 
FF EE DD CC BB AA 99 88 77 66 55 44 33 22 11 00 
+1

BTW: Vous devriez utilisez le préfixe const void * ptr et const char * pour préciser que vous ne modifierez pas ces tampons. – mmmmmmmm

+0

@rstevens: D'accord! – xian

+1

c'est pourquoi j'aime tellement le débordement de pile. ces petits problèmes amusants surgissent de temps en temps et quelqu'un dépose dans un extrait de code et son résolu ... – MikeJ

Répondre

25
#include <iostream> 
using namespace std; 
int main() { 
    char c = 123; 
    cout << hex << int(c) << endl; 
} 

Edit: avec zéro padding:

#include <iostream> 
#include <iomanip> 
using namespace std; 
int main() { 
    char c = 13; 
    cout << hex << setw(2) << setfill('0') << int(c) << endl; 
} 
+0

Ne va-t-il pas simplement le sortir sur la console? – xian

+0

Pourriez-vous expliquer pourquoi cela devrait fonctionner différemment de l'utilisation de stream.hex, comme le demandeur déjà essayé? –

+0

Je trouve que le modificateur de flux 'hex' est un peu douloureux. Si vous produisez d'autres types, vous devez continuer à changer le flux (en utilisant 'dec' par exemple) et pour autant que je sache, il ne fait pas de zéros en tête. –

6
char upperToHex(int byteVal) 
{ 
    int i = (byteVal & 0xF0) >> 4; 
    return nibbleToHex(i); 
} 

char lowerToHex(int byteVal) 
{ 
    int i = (byteVal & 0x0F); 
    return nibbleToHex(i); 
} 

char nibbleToHex(int nibble) 
{ 
    const int ascii_zero = 48; 
    const int ascii_a = 65; 

    if((nibble >= 0) && (nibble <= 9)) 
    { 
     return (char) (nibble + ascii_zero); 
    } 
    if((nibble >= 10) && (nibble <= 15)) 
    { 
     return (char) (nibble - 10 + ascii_a); 
    } 
    return '?'; 
} 

code plus here.

0

Je fais habituellement une fonction qui retourne les chiffres et simplement l'utiliser:

void CharToHex(char c, char *Hex) 
{ 
    Hex[0]=HexDigit(c>>4); 
    Hex[1]=HexDigit(c&0xF); 
} 

char HexDigit(char c) 
{ 
    if(c<10) 
    return c; 
    else 
    return c-10+'A'; 
} 
-1

Il vous suffit de configurer votre flux une fois:

stream << std::hex << std::setfill('0') << std::setw(2) 
+4

-1 [Ceci est faux] (http://www.ideone.com/Xwjtz). Comment a-t-il évité les downvotes pendant plus de deux ans ?! –

1

Essayez:

#include <iomanip> 
.... 
stream << std::hex << static_cast<int>(buf[i]); 
1

Vous pouvez aussi le faire en utilisant quelque chose d'un peu plus ancienne:

char buffer[3];//room for 2 hex digits and \0 
sprintf(buffer,"%02X ",onebyte); 
0

CHAR wchar_t (unicode) chaîne HEX

wchar_t* CharToWstring(CHAR Character) 
{ 
wchar_t TargetString[10]; 
swprintf_s(TargetString, L"%02X", Character); 

// then cut off the extra characters 
size_t Length = wcslen(TargetString); 

wchar_t *r = new wchar_t[3]; 
r[0] = TargetString[Length-2]; 
r[1] = TargetString[Length-1]; 
r[2] = '\0'; 
return r; 
}