2016-12-21 2 views
0

Ich versuche Puffer zu Hex-String in c als unten zu konvertieren, das Bild unten zu konvertieren ist die Eingabedatei enter image description here es ist eine Binärdatei.die Ausgabepuffer auf Hex-String in c

#include "stdio.h" 
#include "stdlib.h" 

#include "string.h" 
#include "fcntl.h" 


#if defined(_MSC_VER) 
#include <BaseTsd.h> 
typedef SSIZE_T ssize_t; 
#endif 

#define BUFF_SIZE 5  

int main() 
{ 
    char  buff[BUFF_SIZE]; 
    int  fd; 
    ssize_t rd_size; 
    FILE *rfp; 
    FILE *ofp; 
    ofp = fopen("output.txt", "w"); 
    rfp = fopen("test.bin", "rb"); 


     while (4== (fread(buff, 1, 4, rfp))) 
     { 
      fprintf(ofp, "%02X%02X%02X%02X \n", buff[0], buff[1], buff[2], buff[3]); 
     } 

    fclose(ofp); 
    fclose(rfp); 
    return 0; 
} 

dann verwende ich über Code, ich habe ist zu Hex-Datei aber ich habe das Problem bei Ergebnis bekommt.

04002B2B 
000001FFFFFFFF 
00030003 
00000000 
00000000 
00000000 
00000300 
00000000 
00000000 
00000000 
00000000 
00000000 
00000000 
00000000 
00500050 
00500050 
00500050 
00500050 
00000000 
FFFFFF80002000 
00000000 
08700F00 
00000000 
00000000 
00000001 
00000002 
00000003 
00000004 
00000005 
00000006 
00000007 
FFFFFF800FFFFFFFF01E 
087007FFFFFF80 
00320032 
0BFFFFFFB80820 
00050005 
2DFFFFFFC7114D 
00FFFFFFC20118 
00001B58 

Wie Sie, dass die obige Datei sehen kann, vor allem will ich nicht auf „000001FFFFFFFF“ diese Ausgabe. Aber ich weiß nicht, was soll ich

Update

ich tun möchte, sollte in den Linux laufen zu lassen. aber wenn ich eine execute-datei mache, bekomme ich den segmant-fehler. Können Sie mich wissen lassen, was ich tun soll?

Antwort

2

Das Hauptproblem dabei ist, dass Ihr char Typ signed zu sein scheint (wenn charsigned oder unsigned ist die Umsetzung spezifisch ist). Das bedeutet, dass Werte, die größer oder gleich 0x80 sind, als negative Werte behandelt werden (mit two's complement Systemen).

Und wenn Sie einen solchen Wert an printf übergeben und der Wert ist promoted zu einem int ist es vorzeichenerweitert. So 0xff wird 0xffffffff, die dann gedruckt wird. Wenn Sie stattdessen unsigned char für Ihre Werte verwenden, werden Werte wie 0xff nicht erweitert, wenn sie zu unsigned int befördert werden. So wird 0xff zu 0x000000ff heraufgestuft, und die führenden Nullen werden nicht gedruckt.


Ein anderes Problem ist, dass Sie das falsche Format für printf verwenden. Das Format "%x" ist für unsigned int und nicht unsigned char. Wenn Sie z.B. this printf (and family) reference sehen Sie eine große Tabelle mit dem ganzen Formatierungscode und den unterschiedlichen Größenpräfixen für verschiedene Arten. Um eine unsigned char zu drucken, sollten Sie das Präfix hh wie in "%hhx" verwenden.

+0

schnelle Frage. Ich möchte im linux mit gcc laufen, aber ich habe einige segmant Fehler, – grander3

+0

@ grander3 Das ist ein anderes Problem völlig, und etwas, über das Sie eine neue Frage stellen sollten. Aber bevor Sie das tun, verwenden Sie bitte einen Debugger, um herauszufinden, * wo * der Absturz geschieht. Geben Sie in der angezeigten Quelle den Standort des Absturzes mit einem Kommentar an. Zeigen Sie auch die Werte aller beteiligten Variablen zum Zeitpunkt des Absturzes. Oh, und wenn Sie den Absturz bemerken, gehen Sie sicher den Callstack zu * Ihrem * Code hoch. –

+0

@ grander3 Auch bitte [die Tour] (http://stackoverflow.com/tour) und [lesen Sie, wie man gute Fragen stellt] (http://stackoverflow.com/help/how-to-ask). Das wird dir hier auf stackoverflow.com helfen. –

Verwandte Themen