Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   BCD Wert Umwandeln in Double oder Extended (https://www.delphipraxis.net/138219-bcd-wert-umwandeln-double-oder-extended.html)

SimStar001 5. Aug 2009 10:40


BCD Wert Umwandeln in Double oder Extended
 
Hallo, ich habe aus dem Flight Simulator einen Wert im BCD Format Codiert.

Es handelt sich dabei um die COM1 Frequenz.
wie bekomme ich den Wert jetzt in einen Double oder Extended wert?

gibst dafür schon ne Function?

LG Marco

p80286 5. Aug 2009 13:56

Re: BCD Wert Umwandeln in Double oder Extended
 
Hallo Marco,

warum machst Du es nicht selbst? offiziell gibt's da nichts (soweit ich weiß).
Aber bist Du Dir sicher? BCD und das Intel-Format vertragen sich nicht so besonders.
Ausserdem ist BCD doch mit den Großrechnern zusammen ausgestorben?

Gruß K-H

SimStar001 5. Aug 2009 14:37

Re: BCD Wert Umwandeln in Double oder Extended
 
Also lauft FS Interoagte, welches die Variablen ausließt, ist der inhalt, welcher ausgelesen wird vom Type U16 und als Remark steht folgendes geschrieben:
"Frequency show as BCD (Binary Coded Decimal), however the prefixed "1" is removed" also als anzeige im FS hat man ja dann 121.825 usw. und so muss ich es am Ende auch umwandeln können.

Also wie stell ich das am besten an? ich hatte schon ein paar codes aber die haben nicht das gewünschte ergebnis gebracht!

p80286 5. Aug 2009 15:30

Re: BCD Wert Umwandeln in Double oder Extended
 
Hallo Marco,

im Prinzip sollte das so gehen:

x'12 34 56 78' das wären 4 Byte mit bcd-Ziffern
entsprechend
Delphi-Quellcode:
 
bcdarray = array [1..4] of byte;
ergebnis = cardinal;
 
ergebnis:=          bcdarray[4] and $f;
ergebnis:=ergebnis+((bcdarray[4] shr 4) *      10);
ergebnis:=ergebnis+( bcdarray[3] and $f)*     100);
ergebnis:=ergebnis+((bcdarray[3] shr 4) *    1000);
ergebnis:=ergebnis+( bcdarray[2] and $f)*   10000);
ergebnis:=ergebnis+((bcdarray[2] shr 4) *  100000);
ergebnis:=ergebnis+( bcdarray[1] and $f)* 1000000);
ergebnis:=ergebnis+((bcdarray[1] shr 4) *10000000);
Da ich nur 4 Byte große BCDs kenne hab ich das mal als Beispiel genommen.
U16 deutet natürlich auf 16 Bit =2Byte hin und dann kannst Du Dir die Hälfte sparen.

Gruß
K-H

[edit] Ich hab den real-Datentyp übersehen, aber daß ist im Prinzip das Gleiche nur daß man durch 10/100... teilt ist

himitsu 5. Aug 2009 16:22

Re: BCD Wert Umwandeln in Double oder Extended
 
welches Delphi hast du denn?
und da schonmal in die OH geschaut, was sich zu BCD finden läßt?

p80286 5. Aug 2009 17:18

Re: BCD Wert Umwandeln in Double oder Extended
 
in D7 gibt's noch kein BCD
Turbo Delphi (D2006) weiß das es BCDs gibt
einschl. der notwendigen Fuktionen.

Gruß
K-H

himitsu 5. Aug 2009 18:15

Re: BCD Wert Umwandeln in Double oder Extended
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von p80286
in D7 gibt's noch kein BCD

siehe Unit FMTBcd

zum Glück geht vom D7 die "alte" OH noch :stupid:


aber im Prinzip wurde die Rechenweise schon gesagt, wobei BCD nicht gleich BCD
BCD = Binär CKodierte Dezimalzahl

und da gibt es mehrere Formate, aber meistens meint man wohl wirklich das oben genannte ... also 4 Bit je Dezimalstelle und der Inhalt ganz normal Zweierkomplement


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz