Hallo Freunde !
Ich habe Datenfiles, die in Turbo Pascal 6.0 erstellt wurden, und muß
nun die Daten extrahieren.
Probleme habe ich bei den Real-Typen.
Pascal verwendet ein 6 Byte Format, und ich habe im Netz schon einige
Zeit gestöbert, aber immer unterschiedliche Definitionen gefunden.
Entweder
MSB ----- LSB
1 Bit Vorzeichen, 39 Bit Mantisse, 8 Bit Exponent
oder
MSB ----- LSB
8 Bit Exponent, 1 Bit Vorzeichen, 39 Bit Mantisse
mit der Konvertierungsfunktion
S=Vorzeichen
E=Exponent
M=Mantisse
Double = (-1)^S*2^(E-129)*(1.M) bei 0>E<=255
Bei E=0 => Double = 0
Wobei ich die Mantisse Bitweise in ein Double konvertiere und solange
durch 10 Dividiere bis sie < 1 ist und dann 1 hinzuaddiere (1.M)
Ich habe schon alle Varianten ausgetestet - aber ich bekommen nie
vernünftige Zahlen raus.
Da ich leider kein Turbo Pascal habe, habe ich auch keine Referenzdaten
Bytefolge und Double Wert um dies zu überprüfen.
Vielleich hat jemand solche Daten , oder weiß was falsch ist.
Danke
Gruß Peter
PETROV schrieb:> Ich muß das leider in VB machen
Warum 'muss'? Man nimmt das was passt. Dann könntest du zumindest Delphi
nehmen und damit ein paar einfache Zahlen erzeugen und abspeichern und
damit herausfinden wie die Konvertierung aussieht.
PETROV schrieb:> Wobei ich die Mantisse Bitweise in ein Double konvertiere und solange> durch 10 Dividiere bis sie < 1 ist und dann 1 hinzuaddiere (1.M)
Das kapiere ich ehrlich gesagt nicht. Die Mantisse ist doch binär, also
warum durch 10 dividieren?
Schau dir mal genau die IEEE 754 oder ähnliche Definitionen zu Floating
point Zahlen an. Ich meine zwar daß Turbo Pascal keiner der Standards
genommen hat, aber vieleicht ähnlich.
Wenn du was raus findest wäre es nett das hier zu posten.
Viel Erfolg
Ich habe das schon erfolgreich vom S5-Real Format in IEE754
genacht.
Die Mantisse ist der Wert nach dem Komma (1.M) daher die Mantisse sooft
durch 10 bis sie "Dezimal" kleiner als 1 ist und dann 1 dazu.
VB muß deßhalb sein, da diese Funktion ein ADD-ON für WINCC sein muß,
das geht mit Delphi nunmal nicht.
Weiss jemand welche der Defininitionen nun die richtige ist ?
Gruß peter
PETROV schrieb:> MSB ----- LSB> 1 Bit Vorzeichen, 39 Bit Mantisse, 8 Bit Exponent
Das ist der Datentyp Real48( aus Object Pascal Sprachreferenz zu D5).
Bei den anderen Real-Typen ist das Vorzeichenbit auch immer das MSB.
gk
Hallo PETROV!
Ich beziehe mich auf Turbo Pascal (TP) 5.0, dürfte aber auch für 6.0
gelten:
Die Definition
MSB ----- LSB
1 Bit Vorzeichen, 39 Bit Mantisse, 8 Bit Exponent
Real = (-1)^S*2^(E-129)*(1.M) bei 0<E<=255 (Korrektur "<" statt ">")
Bei E=0 => Real = 0
ist OK, ABER TP-intern wird das höchstwertige Byte (das mit dem
Vorzeichen) an die höchste Speicheradresse gelegt, dann kommen die
restlichen Bytes der Mantisse in Richtung absteigender Adressen und zum
Schluss der Exponent an der niedrigsten Speicheradresse.
Zum Hinausschreiben wird in TP die BlockWrite-Prozedur verwendet, und
die beginnt aber mit der Schreibeoperation von der niedrigsten Adresse
aus => beim Lesen mit VB bekommst Du zuerst den Exponenten!
Grüße
Roland
Dann mit Break/Watch | Add Watch memw[s:o ], memw[s:o+2] und memw[s:o+4] die lo-hi-verdrehten Hex-Werte anschauen. Mit F6 kommt man in das Watch-Fenster, mit F8 kann man zeilenweise singlesteppen.