Das Ausdrucken von Hex-Werten eines Char * -Arrays in C ergibt ungerade Werte für die Binäreingabe

7

Hier ist ein seltsames Problem, das mich schon ein paar Mal überhäuft hat.

Das Programm wird in C89 geschrieben und liest eine Datei 16 Bytes gleichzeitig in ein char * -Array (mit fread und einer Größe von sizeof (char)). Die Datei wird mit den "rb" Flags geöffnet. Das Array wird dann in eine Funktion übergeben, die im Grunde die 16 Hex-Werte nimmt und sie in eine Zeichenfolge steckt, wobei jeder Wert durch ein Leerzeichen getrennt ist.

Hier kommt die Seltsamkeit ins Spiel. Die Funktion erzeugt einen schönen Hex-Dump, 16 Bytes gleichzeitig, für eine Textdateieingabe, die ich habe. Aber es versaut, wenn ich es auf einem kleinen Bitmap-Bild versuche - ich am Ende mit der Ausgabe in der Zeichenfolge wie ffffff88 statt nur 88.

Die Hexadezimalwerte werden mit sprintf ("% 02x", input [i]) in die Ausgabezeichenfolge eingefügt. in einer Schleife.

Warum würde dies für einige Dateien richtig funktionieren, aber nicht für andere?

    
Kozaki 20.11.2009, 22:12
quelle

2 Antworten

9

Was Sie sehen, ist das Ergebnis der Zeichenerweiterung von char nach int , nach unsigned char * oder nach unsigned char , bevor die Umwandlung in int (implizit?) ausgeführt wird, um Ihr Problem zu beheben.

    
rsp 20.11.2009, 22:19
quelle
11

In C wird das Zeichen als ein signierter Wert behandelt, es sei denn, Sie geben es als unsigniert an. Es scheint, dass, wenn Sie Parameter an eine Funktion übergeben, dass wenn der Parameter zufällig ein char ist, er auf die Größe einer regulären Ganzzahl "aufgefüllt" wird. Wenn Sie den Compiler nicht darauf hinweisen, dass dies auf nicht signierte Weise erfolgen soll, wird 128 zu 0xFFFFFF80 und so weiter.

Die Zeichenerweiterung findet also statt, bevor der Druckformatierer überhaupt den Wert betrachten kann. Was das bedeutet ist, dass

%Vor%

löst Ihr Problem nicht, da der Wert von input [i] vorzeichenerhöht wird. Daher werden alle Werte von 128 bis 255 als -127 bis -1 behandelt und werden zu 0xFFFFFF80 bis 0xFFFFFF, dann werden sie umgewandelt, während

%Vor%

wird den Trick machen, ist aber irgendwie unbeholfen und schwer zu lesen. Am besten sollte der Typ von input [] vorzeichenloses Zeichen an erster Stelle sein.

    
JustJeff 20.11.2009 22:19
quelle

Tags und Links