Я недавно портировал некоторый код C на C ++. У меня есть функция, которая выводит hexdump и изменила его с использования printfs на couts (в конце концов, он будет выведен в файл, поэтому все равно будет использовать потоки c ++).
Пример кода выглядит следующим образом:
#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);
затем код выводится правильно и отображается правильная информация hexdump.
Однако, когда я заменяю это следующей строкой
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 ................
Забыл привести чарса к инту
std::cout << " " << std::setfill('0') << std::setw(2) << std::hex << static_cast<int>(c) << std::dec;
Outout тогда, как и ожидалось
Других решений пока нет …