Wie konvertieren von Hexadezimal zu Dezimal?
Ich habe verschiedene Hex-Daten kommen und die gespeicherte in ein integer-Typ zu registrieren.
Wenn ich fprint kann ich das folgende sehen:
0x3076
0x307c
.
.
.
Allerdings würde ich mag, um zu zeigen, eine Dezimale version der oben-erwähnt Hex-Daten wie folgt.
12406
12412
.
.
.
In der Theorie, sagen wir mal für den ersten Wert, den Sie tun, die folgenden in das Dezimalformat konvertieren.
(6* 16^0)+(7 * 16^1)+(0*16^2)+(3*16^3)=6 + 112+ 0 + 12288 = 12406
Also WENN ich die Charakter-basierte version von "message = 0x3076" und auch, WENN ich in der Lage bin, um jedes einzelne Zeichen 6 - 7 - 0 - 3 ich kann die Berechnung der Dezimalzahl!
So, ich beschlossen, zu teilen "3076" von 1000. Ich wurde erwartet, zu bekommen 3, ich habe aber ZWEI Zeichen statt! allerdings, wenn ich in der Lage war, 3 für den Rest der "307c" ich bin nicht in der Lage zu bekommen, "C". Wenn es dezimal dies funktioniert möglicherweise nicht hex!
Auch, ich habe versucht, " strtol
" - Befehl. Ich verwende Cygwin zu kompilieren meines Codes, ich bin nicht sicher, wo der Fehler ist! Was habe ich falsch gemacht?
So, ich muss nur einen Weg finden, wie JEDES EINZELNE Zeichen aus der HEX-Daten!
Jede Idee bitte?
P. S.
Hier ist mein code, um zu helfen, Sie geben mir eine Idee.
int get_readings(int source, int phase, int max_tries)
{
uint8_t buf[MAX_IEC1107_MSG_BODY];
uint8_t inbuf[MAX_IEC1107_MSG_BODY];
int inlen;
uint8_t *s;
int32_t value;
int status;
double voltage;
double current;
double active_power;
double reactive_power;
double apparent_power;
double power_factor;
double frequency;
s = buf;
*s++ = HOST_CMD_GET_READINGS_PHASE_1 + phase;
*s++ = 0x00;
if (max_tries != 1)
meter_set_max_tries(&emeter[source].meter_msg, max_tries);
if (meter_exchange(&emeter[source].meter_msg, buf, 2, inbuf, &inlen)
&&
inbuf[1] != 0xFF)
{
emeter[source].no_response = FALSE;
s = inbuf;
/* Get current readings */
value = (s[3] << 8) | s[2];
fprint(stderr, "value:" %p\n, value); //this give me HEX code
.
.
.
- Wenn die Zahl in eine integer-variable, dann ist es nicht gespeichert in hex. Du bist einfach der (vermutlich?) drucken Sie es aus, wie hex mit fprintf, mit dem %x-Planer. Drucken Sie die gleiche Zahl mit %u statt.
- Sie müssen wirklich, veröffentlichen Sie Ihren code und Ihre genauen ein-und Ausgang, wenn Sie wissen möchten, warum es falsch ist.
- Vane; ich habe gerade meinen code. Danke!
- ooga: Wenn ich die anderen als "%p", werde ich mir eine falsche Zahl! Woher ich das weiß? Denn es sollte geben Sie mir einige zahlen rund 120 V, die meine Spannung!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim Lesen in eine Zeichenkette, die eine Zahl in hexadezimal, die Verwendung
strtol()
zu konvertieren, um eine lange. Dann, wenn Sie drucken möchten, die Zahl im Dezimalsystem verwenden Sieprintf()
mit einem%d
Formatbezeichner.Einmal Lesen Sie die strings, longs mit
strtol
und arbeiten nach dem sehnt, der Mathematik sollte sich.LONG_MAX
. Auf 32bit-Systemen in der Regel kann dies ein problem beim Lesen von RFID-tags in hexa und versuchen, konvertieren Sie Sie in lesbaren Dezimalformat.Nur mit der folgenden Zeile konnte ich das Problem lösen!
Wert gezeigt wurde, wie HEX als ich verwendet, um zu verwenden, %p! Dann wechselte ich zu x! und wie muss ich 124.06 nicht 12406, in anderen Worten 2 Kommastellen, fügte ich hinzu .2f!
Danke an Euch alle!
Du verwechselst "integer" und "dezimal" - eine "ganze Zahl" ist eine Zahl, gespeichert in einem register oder variable, während ein "decimal" ist eine Zeichenfolge, die eine Zahl in der Basis 10.
Also der Umwandlung von hexadezimal-in Dezimalzahl ist eine zwei-Schritt-Prozess. Konvertieren Sie zuerst die hexadezimalen integer (die Sie scheinen gemacht zu haben, mit Ihr "In der Theorie" - Gleichung). Sie dann wandle die ganze Zahl in Dezimalschreibweise.
Gibt es viele Möglichkeiten, zu tun, entweder von diesen Aufgaben
strtol
undscanf
konvertieren entweder hexadezimal-oder dezimal-integer.printf
kann konvertieren integer zu entweder hexedecimal oder decimal. Oder schreiben Sie Ihre eigenen Routinen, die der Manipulation mit Zeichen zu tun, entweder von diesen Dingen.ch - '0'
konvertieren die Zeichench
um eine ganze Zahl, wenn es eine Ziffer ist.ch - 'a' + 10
arbeitet für die hex-Ziffern a..f1) nur zum drucken:
2) für die Berechnung verwenden: