2015-01-31 5 views
0

У меня есть выход заявление с printf в C++, которая выглядит следующим образом:C++ станд :: соиЬ в шестнадцатеричном

for(int i=0; i<6; i++) 
     printf("%.2X", (unsigned char) iter->hwaddress[i]); 

мне нужно сделать вывод с std::cout, я попытался сделать это следующим образом:

for(int i=0; i<6; i++) 
    cout << hex << (unsigned char) iter->hwaddress[i]; 

, но это просто дает мне:

�:�:w:�:�: 

кто-нибудь знает, как это сделать?

ответ

5

Вы должны бросить его в int:

char c = 15; 
cout << hex << setfill('0') << setw(2) << static_cast<int>(c); // prints "0f" 

hex влияет только на целое число I/O, которая char не считается частью - так что ваш код будет по-прежнему выводить фактические char с.

+0

Если 'char' подписан, а' c' отрицательный, это даст более длинные результаты, чем ожидает OP (и приведение в 'unsigned' не помогает). Вам нужно будет пойти неловко выглядящий маршрут и использовать 'static_cast (static_cast (c))', чтобы избежать расширения знака. – Wintermute

0

Не отбрасывать до unsigned char, а целому числу.

#include <iostream> 
#include <iomanip> 
#include <cstdio> 

int 
main() 
{ 
    char numbers[] = {1, 2, 3, 4, 5, 6}; 
    // Using C-style printf:  
    for (int i = 0; i < 6; i++) 
    std::printf("%02X", static_cast<unsigned>(numbers[i])); 
    printf("\n"); 
    // Using C++ streams: 
    for (int i = 0; i < 6; i++) 
    std::cout << std::hex << std::setw(2) << std::setfill('0') 
       << static_cast<unsigned>(numbers[i]); 
    std::cout << std::endl; 
} 

Оператор << перегружен на этих типах. Также избегайте приведения в стиле C в пользу static_cast, если вам нужно вообще бросить.

1

Если значения этих iter->hwaddress[i] являются аппаратными адресами, почему бы вам (reinterpret_) не направить их на реальные указатели? Затем cout будет печатать их в шестнадцатеричном виде без каких-либо дополнительных усилий.

cout << reinterpret_cast<void*>(iter->hwaddress[i]); 

Неясно, требуется ли фиксированное количество цифр. Для этого могут потребоваться некоторые инструменты в <iomanip>.