2009-03-08 15 views
14

Şimdilik şu ana kadar yaptığım şey:Bir char'in hex değerlerini ASCII'de bir metin dosyasına nasıl yazarsınız?

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] << ' '; 
    } 
} 

Stream.hex, stream.setf (std :: ios :: hex) yapmayı denedim, ayrıca Google'ı biraz aramaya çalıştım. Ben de denedim:

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

Ama bu da işe yaramıyor.

Şu anda ürettiği bazı çıktıların bir örneği:

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

Çıktının aşağıdaki gibi görünmesini istiyorum:

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

: You should Bu arabellekleri değiştirmeyeceğinizi açıkça belirtmek için const void * ptr ve const char * önekini kullanın. – mmmmmmmm

+0

@rstevens: Tamam! – xian

+1

bu yüzden yığın taşmasını çok seviyorum. Bu eğlenceli küçük problemler zaman zaman ortaya çıkıyor ve birisi kodun bir parçacığında düşüyor ve çözüldü ... – MikeJ

cevap

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

Düzenleme: sıfır dolgu ile:

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

Bu sadece konsola çıktı değil mi? – xian

+0

Neden bunun daha önce denediğini düşündüğümüz gibi stream.hex'i kullanmanın neden farklı olduğunu açıklar mısınız? –

+0

'Altıgen' akış değiştiricisini biraz acı buluyorum. Eğer başka türler üretiyorsanız, akışı geri almanız gerekir (örneğin 'dec' kullanarak) ve bildiğim kadarıyla, baştaki sıfırları yapmaz. –

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 '?'; 
} 

Daha kod here İşte

şu anda üreten bazı çıkışın bir örnektir.

Genellikle basamak döner ve bir işlev yapmak
0

sadece kullanmak:

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

Siz sadece akışı yapılandırmanız gerekir bir kez:

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

-1 [Bu yanlış] (http://www.ideone.com/Xwjtz). İki yıldan uzun süredir düşüşleri nasıl önledi ?! –

1

deneyin: Ayrıca o eski moda-biraz daha bir şeyler kullanarak kayıt olabilirsiniz

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

: wchar_t için

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

CHAR (unicode) HEX dize BTW

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; 
} 
İlgili konular