Hexdump структуры не выводит правильную информацию

0

Недавно я портировал код 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);

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

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

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  ................
Теги:
hexdump

1 ответ

3
Лучший ответ

Забыл передать char в int

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

Выходы затем ожидаются

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню