2017-09-10 11 views
0

Ich habe Code in einem C-Programm mit Hex-Daten, die ich iteriert werden soll, beispielsweise jede der Hex-Bytes auszudrucken:C Druck hex Bytes

char input[] = "\x31\xd2\xb2\x30"; 
for (int i = 0; i < strlen(input); i++) { 
    printf("%02X\n", input[i]); 
} 

Allerdings ist der Ausgang nicht, was ich erwarten, beispielsweise der oben genannte Druck:

31 
FFFFFFD2 
FFFFFFB2 
30 

ich habe versucht, auch die Ausgabe als (unsigned int) gegossen, jedoch erhalte ich die gleiche Leistung.

Kann jemand auf das Problem mit diesem einfachen Skript hinweisen?

+1

Auf Ihrem System ist 'char' wahrscheinlich" signiert ". Die Daten '\ xd2' sind also negativ. Sie übergeben diesen Wert an "printf" und es wird auf "int" hochgestuft, das ebenfalls signiert ist. Der Formatbezeichner '% X' erwartet jedoch einen' unsigned int' und interpretiert die Binärdaten entsprechend. Es ist * undefiniertes Verhalten *. –

Antwort

1

Die Argumente an printf bestanden sind Zeichen erweitert, wenn Sie sie zu einem Typ ohne Vorzeichen wie diese Stimmen:

printf("%02X\n", (unsigned char)input[i]); 
+0

Hoppla, du hast Recht. Ich habe einen unsigned Int verwendet, aber natürlich ist es ein Char. – user1220022

0

char input[] muss unsigned char input[] sein. So speichern Sie binäre Bytes.

1

printf("%02X") eine ganze Zahl ohne Vorzeichen erwartet; Das Übergeben eines negativen Werts vom Typ char (und 0xD2 vom Typ char ist ein negativer Wert) wird dazu führen, dass der negative char Wert auf 32 Bit unsigned int hochgesetzt wird, wodurch die führenden Bits mit 1 aufgefüllt werden und am Ende 0xFFFFFFD2 ergeben. Dies wird dann gedruckt.

Um dies zu überwinden, könnten Sie „sagen“ printf den Wert als 8-Bit-Wert zur Verfügung gestellt nehmen:

printf("%02hhX\n", input[i]) 

Eine andere Möglichkeit wäre input als unsigned char, zu erklären, denn dann wäre 0xD2 nicht "in Betracht gezogen werden negativ“und die Förderung auf 32 Bit würde wie erwartet:

unsigned char input[] = "\x31\xd2\xb2\x30"; 

anzumerken, dass dann die Eingabe zu werfen strlen würde erfordern, dh strlen((char*)intput).

0
// You can use like this 

char input[] = "\x31\xd2\xb2\x30"; 

for (int i = 0; i < strlen(input); i++) { 
    printf("%02X\n", input[i] & 0xff); 
} 

Output: 
31 
D2 
B2 
30 

wird es die oberen Bits ausblenden und nur die unteren 8 Bits behalten.