2013-11-21 3 views
0

Я недавно портировал код C на C++. У меня есть функция, которая выводит hexdump и меняет ее с использованием printfs на couts (в конечном итоге она будет выводиться в файл, поэтому будет использовать потоки C++).Hexdump структуры не выводит правильную информацию

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

#include <iostream> 
#include <iomanip> 
#include <string> 

struct Blah 
{ 
    int x; 
    int y; 
    int z; 
    int g; 
}; 

void hex_dump(const std::string& desc, const void* addr, int len) 
{ 
    int i; 
    unsigned char buff[17]; 
    unsigned char *pc = (unsigned char*)addr; 

    // Output description if given. 
    std::cout << desc << std::endl; 

    // Process every byte in the data. 
    for (i = 0; i < len; i++) 
    { 
     // Multiple of 16 means new line (with line offset). 

     if ((i % 16) == 0) 
     { 
      // Just don't print ASCII for the zeroth line. 
      if (i != 0) 
      { 
       std::cout << " " << buff << "\n"; 
      } 

      // Output the offset. 
      std::cout << std::setfill('0') << std::setw(4) << std::hex << i << std::dec; 
     } 

     // Now the hex code for the specific character. 
     unsigned char c = pc[i]; 
     //printf (" %02x", c); 
     //std::cout << " " << std::setfill('0') << std::setw(2) << std::hex << c << std::dec; 

     // And store a printable ASCII character for later. 
     if ((pc[i] < 0x20) || (pc[i] > 0x7e)) 
     { 
      buff[i % 16] = '.'; 
     } 
     else 
     { 
      buff[i % 16] = pc[i]; 
     } 
     buff[(i % 16) + 1] = '\0'; 
    } 

    // Pad out last line if not exactly 16 characters. 
    while ((i % 16) != 0) 
    { 
     std::cout << " "; 
     i++; 
    } 

    // And print the final ASCII bit. 
    std::cout << " " << buff << "\n"; 
} 

int main() 
{ 
    Blah test; 

    test.x = 1; 
    test.y = 2; 
    test.z = 3; 
    test.g = 4; 

    hex_dump("Struct", &test, sizeof(test)); 

    return 0; 
} 

При запуске кода со следующей строкой раскомментирована

printf (" %02x", c); 

затем код выхода правильно и отображается правильная информация шестнадцатеричного.

Однако, когда я заменяю, что с помощью следующей строки

std::cout << " " << std::setfill('0') << std::setw(2) << std::hex << c << std::dec; 

то вывод совершенно случайно, и я не уверен, почему. Я думал, что оператор printf делает то же самое, что и оператор std :: cout, и поэтому удивлен, что данные ошибочны. Любая помощь будет оценена по достоинству.

Редактировать

Ожидаемый выход

Struct 
0000 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 ................ 

ответ

3

Забыла отливать полукокса к ИНТ

std::cout << " " << std::setfill('0') << std::setw(2) << std::hex << static_cast<int>(c) << std::dec; 

Outout затем, как ожидается,

+0

Вы можете принять свой собственный ответ, так как вы поняли это. – Useless

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