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( ..);
    

Anmelden zum Antworten