2009-03-08 5 views
14

Вот что я в настоящее время до сих пор:Как записать шестнадцатеричные значения символа в ASCII в текстовый файл?

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 :: :: ИОС шестигранные), а также поиск Google для немного. Я также пробовал:

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

Но это тоже не работает.

Вот пример некоторого вывода, что он в настоящее время производит:

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

Я хотел бы выход выглядеть следующим образом:

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: Вы должны используйте const void * ptr и const char * префикс, чтобы уточнить, что вы не будете изменять эти буферы. – mmmmmmmm

+0

@ rstevens: Хорошо! – xian

+1

вот почему я так сильно переполняю переполнение стека. эти забавные небольшие проблемы возникают время от времени, и кто-то бросает фрагмент кода и его решение ... – MikeJ

ответ

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

Edit: с нулями:

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

Не будет ли это просто выводить его на консоль? – xian

+0

Не могли бы вы объяснить, почему это должно работать иначе, чем использование stream.hex, как уже просил айзер? –

+0

Я нахожу модификатор потока «hex» немного болью. Если вы выводите другие типы, вам нужно продолжать переключение потока (например, «dec»), и, насколько я знаю, он не имеет ведущих нулей. –

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

Больше кода here.

0

Я обычно делаю функцию, которая возвращает цифры и просто использовать:

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

Вам просто нужно настроить поток один раз:

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

-1 [Это неправильно] (http://www.ideone.com/Xwjtz). Как он избегал downvotes на протяжении более двух лет ?! –

1

Try:

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

Вы также можете сделать это, используя что-то немного более старомодные:

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

CHAR в wchar_t (юникод) 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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^