Konvertieren von Zahlen
-
Hi,
ich lese aus einer Datei Bytes ein nun habe ich 2 Bytes als char[] eingelesen und möchte die in 4 hex Werte umrechnen. Wie kann ich das mit C machen?
Gruß SkySurfer
-
sprintf (adresse_wo_die_hexwerte_hin_sollen, "%02x%02x", bytes[0], bytes[1]);
-
- zu langsam gewesen
-
Das ist ja einfach
-
Wie muss ich es denn machen wenn ich jeden wert in eine extra variable packen will ?
char *version; char *revision; sprintf (version, "%02x", puffer[3]); sprintf(revision, "%02x", puffer[4]); printf ("Ver.: 2.%s\n", version); printf("Rev.: %s\n", revision);
Bringt das Programm zum einfrieren
-
Es wäre schon gut, wenn version und revision auf einen hinreichend großen Puffer zeigen würden, und nicht irgendwo wild in den Speicher, wie es uninitialisierte Zeiger nunmal tun
-
Alternativ kannst du auch den Umweg über die Hex-Strings weglassen und deine Byte-Werte direkt ausgeben:
printf ("Ver.: 2.%02x\n", puffer[3]); printf("Rev.: %02x\n", puffer[4]);
-
char *version; char *revision; sprintf (version, "%02x", puffer[3]); sprintf(revision, "%02x", puffer[4]); printf ("Ver.: 2.%s\n", version); // <-- du willst eine Adress printf("Rev.: %s\n", revision); // <-- als String ausgeben
-
MFK: Ich weiß, man sollte immer mit malloc und free arbeiten .. im moment handelt es sich aber nur um einen Test einer Routine die später in eine DLL soll.
CStoll: Es handelt sich nur um eine Testausgabe, später werden nur die Werte verarbeitet.
Anzi-C: Upps.. ich hab noch die Sternchen davor gesetzt aber leider hat sich nichts daran geändert.
-
SkySurfer schrieb:
MFK: Ich weiß, man sollte immer mit malloc und free arbeiten .. im moment handelt es sich aber nur um einen Test einer Routine die später in eine DLL soll.
Egal ob es ein Test werden soll - du mußt IMMER Speicher bereitstellen (wenn du nicht mit malloc arbeiten willst, kannst du auch jeweils ein char[3] anlegen).
CStoll: Es handelt sich nur um eine Testausgabe, später werden nur die Werte verarbeitet.
Mit welchen Werten willst du später weiterrechnen? Die Hex-Strings oder die Versionsnummern? (ich würde die Version intern lieber als int verwalten)
@Anzi-C: Der rpintf()-Aufruf sieht eigentlich intakt aus - ein String ist nichts weiter als ein char-Pointer und wird auch so verarbeitet.
-
SkySurfer schrieb:
MFK: Ich weiß, man sollte immer mit malloc und free arbeiten .. im moment handelt es sich aber nur um einen Test einer Routine die später in eine DLL soll.
speicher brauchste aber trotzden, ob in der dll oder im testprogramm.
SkySurfer schrieb:
Anzi-C: Upps.. ich hab noch die Sternchen davor gesetzt aber leider hat sich nichts daran geändert.
eben, dann guck' noch mal was MFK geschrieben hat...
-
Ich denke es ist warscheinlich sinnvoller die Versionsnummern als Int werte dann weiter zu verwerden. Wie bekomme ich die dann in einen Int muss man es dann erst wieder in Hex umwandeln um die Zahlen zu bekommen und dann mit atoi in ein int ?
Oder geht das auch irgendwie direkt?
-
SkySurfer schrieb:
Wie bekomme ich die dann in einen Int muss man es dann erst wieder in Hex umwandeln um die Zahlen zu bekommen und dann mit atoi in ein int ?
geht einfach durch zuweisung:
int a = char_array[0]; int b = char_array[1];
-
Wenn mich nicht alles täuscht, sollten in deinem Vorgabefeld "puffer" schon int-Werte drinstehen - die kannst du direkt verwenden.
(andernfalls bräuchten wir mehr Infos, um dir weiterhelfen zu können)
-
Die Version und Revision wird als 2 Hexwerte gespeichert:
z.b. Version 3.00 = 03 00
Ich habs grad versucht: man kann die Chars direkt einem Int zuweisen und bekommt den richtigen Wert.
Thx
-
Ich hab noch ne kleine frage:
ich hab ein Byte in dem die 4 msb's als flag dienen.
ich dachte mir wenn ich es den wert des byte durch 128 teile und etwas > 1 bekomme hab ich das erste flag. dann den modulo davon nehmen und diesen durch 64 teile und wieder > 1 bekomme hab ich das 2. flag usw.
oder gibt es da noch eine elegantere lösung ?
-
SkySurfer schrieb:
oder gibt es da noch eine elegantere lösung
einfach die bits testen
int flag1 = !!(byte & 0x80); ... ... int flag4 = !!(byte & 0x10);
-
SkySurfer schrieb:
Ich hab noch ne kleine frage:
ich hab ein Byte in dem die 4 msb's als flag dienen.
.........
oder gibt es da noch eine elegantere lösung ?[/cpp]
int flag1 = byte/16;
int flag2 = byte%16;
[cpp]
-
haase schrieb:
[/cpp]
int flag1 = byte/16;
int flag2 = byte%16;
[cpp]so geht's bestimmt nicht. ausserdem hat er die bits oben...
-
Das mit dem Bitvergleich hat wunderbar geklappt