Forum: PC-Programmierung 6 Byte Pascal Real-Format


von PETROV (Gast)


Lesenswert?

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

von Arne (Gast)


Lesenswert?

Delphi kann doch noch das alte 6Byte Real Format lesen. Bastel dir doch 
einen Konverter in Delphi.

von PETROV (Gast)


Lesenswert?

Ich muß das leider in VB machen

von U.R. Schmitt (Gast)


Lesenswert?

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

von PETROV (Gast)


Lesenswert?

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

von gk (Gast)


Lesenswert?

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

von PETROV (Gast)


Lesenswert?

Danke

von Roland (Gast)


Lesenswert?

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

von PETROV (Gast)


Lesenswert?

Danke Roland für Deine Info - Jetzt gehts's

Peter

von Hatte gleiches Problem (Gast)


Lesenswert?


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.