C / C ++ ein Byte aus einem hexinput von stdin gelesen
Frage
Kann nicht genau einen Weg finden, wie die folgend in C / C ++ zu tun.
Input: hexdecimal Werte, zum Beispiel: ffffffffff ...
Ich habe den folgenden Code versucht, um die Eingabe zu lesen:
uint16_t twoBytes;
scanf("%x",&twoBytes);
Das ist, funktioniert gut und alle, aber wie gespalten ich die 2bytes in 1bytes uint8_t
Werte (oder vielleicht sogar das erste Byte nur lesen). Möchte das erste Byte von dem Eingang lesen und speichern sie in einer Byte-Matrix in der Lage zu wählen.
uint8_t matrix[50][50]
Da ich in Formatierung nicht sehr geschickt bin / Lesen von Eingabe in C / C ++ (und hat nur verwendet scanf bisher) noch andere Ideen, wie man dies leicht zu tun (und schnell, wenn es geht) wird sehr geschätzt.
Edit:. Gefunden sogar eine bessere Methode durch die fread-Funktion, wie es läßt man angeben, wie viele Bytes aus dem Stream lesen sollte (in diesem Fall stdin) und auf eine Variable / Array speichern
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
Parameter
ptr -. Zeiger auf einen Speicherblock mit einer Mindestgröße von (Größe * count) Bytes
Größe -. Größe in Bytes jedes Element gelesen werden
zählen -. Anzahl der Elemente, von denen jeder mit einer Größe von size Bytes
Strom - Zeiger auf ein File-Objekt, das einen Eingangsstrom angibt.
Lösung
%x
liest ein unsigned int
, kein uint16_t
(dachte, sie auf die jeweilige Plattform die gleiche sein kann).
Um nur ein Byte zu lesen, versuchen Sie dies:
uint32_t byteTmp;
scanf("%2x", &byteTmp);
uint8_t byte = byteTmp;
Dies liest eine unsigned int
, stoppt aber nach der Lektüre zwei Zeichen (zwei Hex-Zeichen gleich acht Bits oder ein Byte).
Andere Tipps
Es sollte möglich sein, die Variable wie folgt aufgeteilt:
uint8_t LowerByte=twoBytes & 256;
uint8_t HigherByte=twoBytes >> 8;
Ein paar Gedanken:
1) es als Zeichen lesen und wandeln sie manuell - schmerzhaft
2) Wenn Sie wissen, dass es ein Vielfach von 4 hexits ist, können Sie einfach in twobytes lesen und dann zu einem Byte-Werten mit hohem = twobytes << 8 konvertieren; low = twobyets & FF;
3)% 2x