Как да създам помощна програма за шестнадесетичен дъмп в C++?

По принцип трябва да напиша помощна програма за шестнадесетичен дъмп, използвайки 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