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++
Antworten
Zu viele Anzeigen?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.
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.
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
.
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;
}