Datei Hex ausgeben
-
int main() { char x; ifstream leseDatei ("compit.pdf", ios::binary); while(leseDatei.get(x)){ printf(" %X",x); } }
Ich möchte die Datei also in hex ausgeben .
Jedoch vergleich Hexeditor und meine ausgabe:
Mein:25 50 44 46 2D 31 2E 34 D 25 FFFFFFE2 FFFFFFE3 FFFFFFCF FFFFFFD3 D A 34 34 20 3
Editor:
25 50 44 46 2D 31 2E 34 0D 25 E2 E3 CF D3 0D 0A ...
Mache ich da etwas mit printf falsch oder ist das FFFFFF und das die 0 llen weggelasen werden normal?
Danke
-
Ja was denn jetzt, C++ oder C?
Da du std::fstream verwendest, geh ich jetzt mal von C++ aus. Dann hast du das falsche Unterforum gewählt.
C++-Version:
#include <iostream> #include <fstream> #include <iomanip> int main() { unsigned char c; std::fstream file("compit.pdf", std::ios::in | std::ios::binary); while(file.read(reinterpret_cast<char*>(&c), 1)) std::cout << std::setw(2) << std::setfill('0') << std::hex << static_cast<int>(c) << " "; std::cout << std::endl; }
und die C-Version mit printf (Worauf es dir anscheinend ankommt, wobei std::cout doch eigentlich viel komfortabler ist, wenn man das mal vergleicht):
#include <stdio.h> int main(void) { unsigned char c; FILE* file = fopen("compit.pdf", "rb"); while(fread(&c, 1, 1, file) && !feof(file)) printf("%02X ", c); printf("\n"); fclose(file); return 0; }
mit %X lagst du schon richtig, die 02 davor bedeuten nun: Auf jeden fall 2 Zeichen ausgeben und wenn nur 1 Zeichen auszugeben ist, die restlichen Stellen mit '0' befüllen.
Achja: und unsigned char verwenden
Edit(s): Schönheitskorrektur, unsigned char-Korrektur und den int-cast kann man sich in C ja schenken...
-
Probier doch mal
unsigned char
anstelle von
char
edit:
und mit
%0.2X
erhäst du zweistellige Hex-Werte mit führender Null (also "0D" anstatt "D")
mfg, loose
-
Danke ihr beiden ,funktioniert jetzt ...
-
Hallo,
ich hoffe es ist nicht schlimm, dass ich einen alten Thread rausgekramt habe, aber ich habe ein ähnliches Problem wie der Threadersteller.
Ich habe vor immer 2 Bytes in ein char Array "opcode" laden und als Hexcode auszugeben (bis zum EOF).Im Hexeditor siehts so aus:
6A026B0C6C3F [...]Aber die Ausgabe meines Programms ist lediglich:
Offset: 0x00 Opcode: 6A ASM: (null) Offset: 0x02 Opcode: 6B ASM: (null) Offset: 0x04 Opcode: 6C ASM: (null)
Er vergisst quasi immer den 1, 3, 5, 7, usw. Offset mit auszugeben.
// Reading out the opcodes int offset=0; unsigned char* opcode; opcode=(unsigned char*)malloc(sizeof(unsigned char)*2); if(opcode==NULL) { printf("ERROR:\tMemory error\n"); for(;;) { } } while(offset<=filesize) { fseek(romfile,offset,SEEK_SET); fread(opcode,2,1,romfile); printf("Offset: 0x%02X | Opcode: %04X | ASM: %s\n", offset, *opcode); offset=offset+2; } fclose(romfile); free(opcode);
Hab jetzt schon alle möglichen Methoden ausprobiert, deshalb kann es sein, dass der Code leicht "verwurschtelt" aussieht (ich probier schon seit heute morgen 4 Uhr daran rum, und ich wette, dass es nur ein ganz einfacher Leichtsinnsfehler ist, den ich mal wieder übersehen habe
grüße aus dem spessart
-
Gaaast schrieb:
Er vergisst quasi immer den 1, 3, 5, 7, usw. Offset mit auszugeben.
... offset=offset+2; ...
^^wie wär's mit
offset++;
statt dieser zeile?
-
Wieso? Er liest doch immer 2 Byte pro Iteration. Ich seh das Problem nicht...
-
Einfacher wäre:
int fd, offset, opcode; fd = open( ...); for ( opcode=offset=0; read( fd, &opcode, 2) == 2; offset+=2) printf( "\n%02x %04x", offset, opcode); close( ..);