Ich weiß, dass wir bei Verwendung von %x
mit printf()
4 Bytes (eine int
in hexadezimaler Schreibweise) vom Stapel drucken. Ich möchte aber nur 1 Byte drucken. Gibt es eine Möglichkeit, dies zu tun?
Annahme: Sie möchten den Wert einer Variablen mit einer Breite von 1 Byte drucken, d. H. char
.
Wenn Sie eine Variable char
haben, sagen Sie char x = 0;
und möchten den Wert drucken, verwenden Sie %hhx
Formatbezeichner mit printf()
.
So etwas wie
printf("%hhx", x);
Andernfalls kann aufgrund einer Standardargumentweiterung eine Anweisung wie
printf("%x", x);
wäre auch korrekt, da printf()
die sizeof(unsigned int)
nicht aus stack liest, der Wert von x
wird basierend auf seinem Typ gelesen und der Wert wird auf jeden Fall zum erforderlichen Typ heraufgestuft.
Sie müssen vorsichtig sein, wie Sie dies tun, um undefined Verhalten zu vermeiden.
Mit dem C-Standard können Sie die int
in einen unsigned char
umwandeln und dann das gewünschte Byte mit Pointer-Arithmetik drucken:
int main()
{
int foo = 2;
unsigned char* p = (unsigned char*)&foo;
printf("%x", p[0]); // outputs the first byte of `foo`
printf("%x", p[1]); // outputs the second byte of `foo`
}
Beachten Sie, dass p[0]
und p[1]
vor der Anzeige der Ausgabe in den breiteren Typ (die int
) konvertiert werden.
Sie können die folgende Lösung verwenden, um ein Byte mit printf
zu drucken:
unsigned char c = 255;
printf("Unsigned char: %hhu\n", c);
Wenn Sie ein einzelnes Byte drucken möchten, das in einem größeren Werttyp vorhanden ist, können Sie den erforderlichen Wert maskieren und/oder herausschieben (z. B. int x = 0x12345678; x & 0x00FF0000 >> 16). Oder rufen Sie einfach das erforderliche Byte ab, indem Sie die benötigte Byteposition mit einem (unsigned) Zeichenzeiger umwandeln und einen Offset verwenden.