3 Stimmen

Extrahieren von Hexdump- oder RAW-Daten einer Datei in Text

Ich habe mich gefragt, ob es eine Möglichkeit gibt, den Hexdump oder die Rohdaten einer Datei in eine txt-Datei auszugeben. zum Beispiel Ich habe eine Datei, sagen wir "data.jpg" (der Dateityp ist irrelevant), wie kann ich den HEXdump (14ed 5602 usw.) in eine Datei "output.txt" exportieren? Wie kann ich außerdem das Format der Ausgabe angeben, z. B. Unicode oder UTF? in C++

2voto

Bernd Elkemann Punkte 22855

Sie können eine Schleife, fread und fprintf verwenden: Mit read erhalten Sie den Byte-Wert der Bytes, und mit fprintf können Sie die %x um hexadezimal in eine Datei zu drucken.

http://www.cplusplus.com/reference/clibrary/cstdio/fread/

http://www.cplusplus.com/reference/clibrary/cstdio/fprintf/

Wenn es schnell gehen soll, lädt man ganze Maschinenwörter (int oder long long) statt einzelner Bytes, wenn es noch schneller gehen soll, freadet man ein ganzes Array, dann sprintf ein ganzes Array, dann fprintf dieses Array in die Datei.

2voto

Björn Pollex Punkte 72424

Vielleicht so etwas wie das hier?

#include <sstream>
#include <iostream>
#include <iomanip>
#include <iterator>
#include <algorithm>

int main()
{
    std::stringstream buffer( "testxzy" );
    std::istreambuf_iterator<char> it( buffer.rdbuf( ) );
    std::istreambuf_iterator<char> end; // eof

    std::cout << std::hex << std::showbase;

    std::copy(it, end, std::ostream_iterator<int>(std::cout));

    std::cout << std::endl;

    return 0;
}

Sie müssen lediglich die buffer mit einer ifstream das die Binärdatei liest und die Ausgabe in eine Textdatei schreibt, indem ein ofstream anstelle von cout .

1voto

Jerry Coffin Punkte 452852

Das ist ziemlich alt - wenn Sie Unicode wollen, müssen Sie das selbst hinzufügen.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    unsigned long offset = 0;
    FILE *input;
    int bytes, i, j;
    unsigned char buffer[16];
    char outbuffer[60];

    if ( argc < 2 ) {
        fprintf(stderr, "\nUsage: dump filename [filename...]");
        return EXIT_FAILURE;
    }

    for (j=1;j<argc; ++j) {

        if ( NULL ==(input=fopen(argv[j], "rb")))
            continue;

        printf("\n%s:\n", argv[j]);

        while (0 < (bytes=fread(buffer, 1, 16, input))) {
            sprintf(outbuffer, "%8.8lx: ", offset+=16);
            for (i=0;i<bytes;i++) {
                sprintf(outbuffer+10+3*i, "%2.2X ",buffer[i]);
                if (!isprint(buffer[i]))
                    buffer[i] = '.';
            }
            printf("%-60s %*.*s\n", outbuffer, bytes, bytes, buffer);
        }
        fclose(input);
    }
    return 0;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X