Press "Enter" to skip to content

hexdump

Czasami zdarza się, że człowiek nie ma aktualnie potrzebnego narzędzia.  Pobieranie z neta jest albo niemożliwe, albo zajmie zbyt dużo czasu, a człowiek chce plikowi w bebechy zajrzeć. No i poczułam coś takiego i klepnęłam taki kawałek kodu (thx widmo za podpowiedź co do zmiany define na wartość predefiniowaną)

#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
/**
* --==LOOKACZ==-- by Angelika Maria Piątkowska aka piatkosia
* kontakt: piatkosia.apt@interia.pl
* Program wyświetla zawartość dowolnego pliku binarnego. Na razie bez możliwości edycji.
* Wywołanie: nazwa_programu plik_do_odczytu
* W przypadku błędnego wyświetlania treści dokumentu proszę ustawić czcionkę Lucida console.
* W przypadku linuxa może się okazać konieczne użycie iconv do źródła w celu zmiany kodowania.
* Kody błędów:
* 0: Program wykonany poprawnie
* 1: Nieprawidłowa ilość parametrów.
* 2: Błąd otwarcia pliku. Prawdopodobnie plik nie istnieje, lub użytkownik nie ma do niego dostępu.
* Pojawiające się co jakiś czas xx to była wartość ffff która na pewno nie była charem, także jakiś inny znak, niż ten, który mógłbyć typu char.
* sprawdzenie kodu błędów:
* systemy POSIX/LINUX: echo $?
* systemy DOS/WINDOWS: echo %errorlevel%
**/
inline void setwinda(){
    #ifdef _WIN32
    system("chcp 1250>NUL");
    #endif
}
inline void unsetwinda(){
    #ifdef _WIN32
    system("chcp 852>NUL");
    #endif
}
using namespace std;
//Program jest krótki, więc nie będę go jakoś rozbijać specjalnie
int main(int argc, char* argv[]){
    setwinda();

    if (argc ==2 && (string)argv[1]=="--help"){
        cout<<"                    --==LOOKACZ==--\n";
        cout<<"Program wyświetla co jest w pliku w formacie hex i ascii. I nic więcej\n";
        cout<<"Użycie\n";
        cout<<argv[0]<<" <plik wejściowy>\n";
        unsetwinda();
        return 0; //przecież program wykonał się poprawnie
        }

    if (argc == 1){
        cout<<"Czegoś chyba zapomniałeś\n Nie wiesz czego?\n sprawdź używając "<<argv[0]<<" --help";
        unsetwinda();
        return 1; //Niepoprawna ilość parametrów
    }

    if (argc > 2){
        cout<<"Nie rozpędzasz się przypadkiem? \n";
        cout<<"Sprawdź: "<<argv[0]<<" --help\n";
        unsetwinda();
        return 1; //niepoprawna ilość argumentów

    }
//No dobra, Jesteśmy pewni, że nikt nie podał tego, czego nie trzeba:)
    ifstream plik; /// Zmienna plikowa klasy ifstream
    plik.open(argv[1], ios::in|ios::binary);
    if (!plik.good()){
        cerr<<"\nBłąd otwarcia pliku";
        unsetwinda();
        return 2; //Błąd otwarcia pliku
    }
    char bufor[16] = {}; ///Tablica do przechowywania danych, na których będziemy operować.
    int waiter = 1; /// Zmienna którą wykorzystamy do przerywania pracy po 20 linijkach wczytanych danych
    cout<<"------------------Wartość hex ------------------ | -Wartość ascii -"<<endl;
    while (!plik.eof()){
        plik.read(bufor, 16);
        //Wypisanie danych w postaci hexowej
        for (int i = 0; i<16; i++){
            cout.width(2);
            cout.fill('0');
            if (((unsigned int)bufor[i]) > 0xff ) cout<<"xx ";
            else cout<<hex<<(unsigned int)bufor[i]<<" "; //Nie nieee, żadnego końca linii nie będzie
        }
        cout<<" | ";
        for (int i = 0; i<16; i++){
            if ((bufor[i])<32) cout<<'.';
            else cout<<bufor[i];
        }
        cout<<endl;
        memset(bufor, 0, 16); //czyszczenie bufora;

        //żeby ekran nie uciekał
        if ((waiter % 20) == 0){
            char a; ///całość by mieć nieco podgląd na plik
            cout<<"--Aby kontynuować naciśnij enter                 |";
            cin.get(a);
        }
        waiter++;

    }
    plik.close();
    unsetwinda();
    return 0;
}