Как мне создать утилиту шестнадцатеричного дампа на С++?

По сути, мне нужно написать утилиту шестнадцатеричного дампа с использованием C++. Это будет выглядеть примерно так

Часть шестнадцатеричного дампа документа Word с использованием Visual Studio

(Часть шестнадцатеричного дампа документа Word с использованием Visual Studio)

Я хочу запросить у пользователя имя файла, а затем отобразить шестнадцатеричные значения, а также переведенные символы ASCII. Я все еще новичок в работе с двоичными файлами, поэтому, если бы вы могли сделать это проще, это было бы очень признательно.


person user2430692    schedule 29.05.2013    source источник
comment
Итак, вы хотите знать, как читать в файле или как отображать байтовые значения в виде шестнадцатеричной строки символов? Или вы хотите, чтобы кто-то написал вам эту программу?   -  person Stefan Falk    schedule 29.05.2013
comment
Второе. Я знаю, как читать файл, но я не знаю, как использовать двоичный файл, когда он у меня есть.   -  person user2430692    schedule 29.05.2013


Ответы (1)


Обычно я не отвечаю на такие вопросы... Но чтобы придумать что-то подобное, многого не нужно, и, возможно, вы сможете извлечь из этого уроки. Вот программа без излишеств, которая просто читает со стандартного ввода и выводит примерно в том же формате, что вы показали. Попробуйте здесь.

Код

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    unsigned long address = 0;
    
    cout << hex << setfill('0');
    while( cin.good() )
    {
        int nread;
        char buf[16];
        
        for( nread = 0; nread < 16 && cin.get(buf[nread]); nread++ );
        if( nread == 0 ) break;
        
        // Show the address
        cout << setw(8) << address;

        // Show the hex codes
        for( int i = 0; i < 16; i++ )
        {
            if( i % 8 == 0 ) cout << ' ';
            if( i < nread )
                cout << ' ' << setw(2) << (unsigned int)(unsigned char)buf[i];
            else 
                cout << "   ";
        }

        // Show printable characters
        cout << "  ";
        for( int i = 0; i < nread; i++)
        {
            if( buf[i] < 32 ) cout << '.';
            else cout << buf[i];
        }
        
        cout << "\n";
        address += 16;
    }
    return 0;
}

Ввод

Hello there, this is a test binary file.
What do you think?

.

Вывод

00000000  48 65 6c 6c 6f 20 74 68  65 72 65 2c 20 74 68 69  Hello there, thi
00000010  73 20 69 73 20 61 20 74  65 73 74 20 62 69 6e 61  s is a test bina
00000020  72 79 20 66 69 6c 65 2e  0a 57 68 61 74 20 64 6f  ry file..What do
00000030  20 79 6f 75 20 74 68 69  6e 6b 3f 0a 0a 2e         you think?...
person paddy    schedule 29.05.2013
comment
Ах, хорошо, вам нужно использовать буфер. Спасибо вам за помощь. - person user2430692; 29.05.2013
comment
Для чего c? -- Просто талисман? ;-) - person Wolf; 01.08.2017
comment
Этот код зависит от того, подписывается ли тип char по умолчанию или нет. - person Wolf; 01.08.2017