Forum: PC-Programmierung Hex zu Dez (BCD) in C


von Jeffrey L. (the_dude)


Lesenswert?

Hallo,
ich möchte in C eine Zahl von hex in Dec umwandeln, wobei der numerische 
Wert gleich bleiben soll, also keine normale Konvertierung.

Ich möchte also aus 32112345dec eine 0x32112345 machen.





Ich finde ein paar Beispiele im internet, die wandeln aber in string um 
was auf meinem msp430 nicht klappt, ich habe den Datentyp string hier 
nicht. evt. mit char[], aber die länge wäre in meinem Fall hier stets 
anders.


Ursprünglich wollte ich die max. 4 Byte große Zahl in einzelen Bytes 
zerlegen und mit 16 multiplizieren. Beim kleinesten Byte klappt das 
halbwegs, zumindest bis ich bis 100d komme, dann scheitert es "irgendwo" 
am Überlauf...
1
45d = 0x2D
2
0x2D / 0x0A = 4    // ermittle Anzahl Überlauf von einer auf zehner
3
4 * 6 = 24d         // Anzahl Überlauf * differenz Überlauf (0x10 - 10dec = 6dec)  
4
24d + 45d = 69d == 0x45  // Wert Überlauf + eigentliche Wert (Einer)
5
6
Das funktioniert bis 99d
7
99d = 0x63
8
0x63 / 0x0A = 9
9
9 * 6 = 54d
10
54d + 99d = 153d == 0x99
11
12
13
ab 100d funktiert es nicht mehr
14
100d = 0x64
15
0x64 / 0x0A = 10
16
10 * 6 = 60d
17
60d + 100d = 160d == 0xA0  / hier sollte 0x100 stehen!
18
19
20
245d = 0xF5
21
0xF5 / 0x0A = 24d
22
24 * 6 = 144d
23
144d + 245d = 389d == 0x185 / hier sollte 0x245 stehen


Mir ist klar, dass der Fehler im Beispiel oben in Zeile 15+16 bzw. 21+22 
liegt. Aber ich verstehe nicht wie ich hier die zweite Stelle des 
Überlaufs verrechnen muss. Vlt. kann mir jemand von Euch einen Tipp 
geben!?

von Harald K. (kirnbichler)


Lesenswert?

Jeffrey L. schrieb:
> ich möchte in C eine Zahl von hex in Dec umwandeln, wobei der numerische
> Wert gleich bleiben soll, also keine normale Konvertierung.
>
> Ich möchte also aus 32112345dec eine 0x32112345 machen.

Das widerspricht sich irgendwie.

Du möchstest nicht "von hex in Dec umwandeln", Du möchstest Dezimal in 
(gepacktes) BCD konvertieren.

https://en.wikipedia.org/wiki/Binary-coded_decimal#Packed_BCD

Das geht so:
1
uint64_t toBcd(uint32_t decVal)
2
{
3
  uint64_t bcdSum = 0;
4
  uint32_t mulDigit = 1;
5
6
  while (decVal > 0 )
7
  {
8
    bcdSum += mulDigit * (decVal % 10);
9
    mulDigit <<= 4;
10
    decVal /= 10;
11
  }
12
13
  return bcdSum;
14
}

Dran denken: Eine 32-Bit-Binärzahl (Wertebereich 0 - 4294967295) kann 
größer werden als eine 32-Bit-BCD-Zahl (Wertebereich 0 - 99999999), 
deswegen uint64_t als Rückgabewert.

von Wendels B. (wendelsberg)


Lesenswert?

Vielleicht wieder diese Frage?
Beitrag "BCD Darstellung einer Dezimalzahl in C"

von B. P. (skorpionx)


Angehängte Dateien:

Lesenswert?

Meine Routine (Auszug...)

von Harald K. (kirnbichler)


Lesenswert?

Warum als *.txt?

von Oliver S. (oliverso)


Lesenswert?

Jeffrey L. schrieb:
> Hallo,
> ich möchte in C eine Zahl von hex in Dec umwandeln, wobei der numerische
> Wert gleich bleiben soll, also keine normale Konvertierung.
>
> Ich möchte also aus 32112345dec eine 0x32112345 machen.

Vielleicht sortierst du deine Gedanken noch einmal neu.

Eine "Zahl" in C als numerischer Wert, mit dem du rechnen kannst (z.B. 
ein int oder unsigned int) ist weder dec noch hex noch sonstwas. Da 
musst du nichts "umwandeln".

Das Zahlensystem kommt erst dann ins Spiel, wenn du Daten ein- oder 
ausgibst, und da zwischen einer String-Repräsentation des Wertes und int 
wandeln musst. Das machen scanf/printf für dich.

Mit den Strings kannst du dann aber nicht rechnen.

Oliver

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Jeffrey L. schrieb:
> ich möchte in C eine Zahl von hex in Dec umwandeln, wobei der numerische
> Wert gleich bleiben soll, also keine normale Konvertierung.
>
> Ich möchte also aus 32112345dec eine 0x32112345 machen.

Eine Zahl mit der Dezimaldarstellung 32112345dec, hat zwingend in 
Hex-Darstellung den Wert 0x01E9FED9. Daran wirst du nichts ändern 
können.
Umgekehrt hätte eine Zahl mit Hex-Darstellung 0x32112345 die 
Dez-Darstellung 839983941dec.

Ob Hex oder Dez ist nur eine Frage der Darstellung.
Du willst aber anscheinen genau den numerischen Wert ändern, auch wenn 
du dir das nicht eingestehen willst.

Bevor du über die Implementierung eines Algorithmus nachdenkst, solltest 
du dir erstmal klar werden, was du willst.

von Peter D. (peda)


Lesenswert?

Jeffrey L. schrieb:
> Ich möchte also aus 32112345dec eine 0x32112345 machen.

Du gibst die Variable per sprintf dezimal "%ld" in einen String 
(char-Array) aus und liest sie dann per sscanf in hex "%lx" wieder ein.

Beitrag #7363080 wurde vom Autor gelöscht.
von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Übrigens:
Zur Umwandlung von Binär in gepacktes BCD gibt es den "double-dabble" 
-Algorithmus:
https://www.mikrocontroller.net/articles/AVR_Arithmetik#Addition_von_$33

aber hier ist die Zahl ja schon dezimal vorgegeben, die Bezeichnung Hex 
war Unsinn.

von Klaus S. (kseege)


Lesenswert?

Jeffrey L. schrieb:
> ich möchte in C eine Zahl von hex in Dec umwandeln, wobei der numerische
> Wert gleich bleiben soll, also keine normale Konvertierung.
>
> Ich möchte also aus 32112345dec eine 0x32112345 machen.

Erstens ist das eine Umwandlung von Dez nach Hex, nicht von Hex nach 
Dez.

Zweitens ist die Umwandlung ganz einfach, man löscht hinten das "dec" 
und fügt vorne "0x" an. Nun sind aber 32112345dec und 0x32112345 zwei 
unterschiedliche Zahlen. Wenn man die eine in die andere umwandeln 
möchte, verändert sich der numerische Wert. Das läßt sich nicht 
vermeiden, es sei den man erfindet eine neue, nicht widerspruchsfreie 
Mathematik.

Deine Beschreibung deutet darauf hin, daß Du ganz grundsätzlich etwas 
nicht oder falsch verstanden hast.

Auch in Deiner Rechnung geht bei mir der Fehler schon in Zeile 3 los, 
wozu eine Multiplikation mit 6?

Gruß Klaus (der soundsovielte)

von Apollo M. (Firma: @home) (majortom)


Lesenswert?


von Christoph db1uq K. (christoph_kessler)


Lesenswert?

>Alles da!
Bitte vorher den ersten Beitrag lesen. Die Formulierung war 
missverständlich, aber es geht gerade nicht um eine Hex-BCD-Wandlung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.