Forum: PC-Programmierung Frage bzgl. Datentypen in VB6


von Willi S. (Gast)


Lesenswert?

Hallo,

wie ich schon vor 2 Wochen gepostet habe, benutze ich VB6 mit der D2xx 
Dll um aus einer Schnittstelle zu lesen. Das byteweise Auslesen 
funktioniert jetzt 1A. Nur mit der Umrechnung habe ich noch große 
Probleme.

Ich lese aus der Schnittstelle:

Byte_0 = 147 'Least Significant Byte
Byte_1 = 82
Byte_2 = 50
Byte_3 = 185 'Most Significant Byte

Die Epochezeit setzt sich aus diesen 4 Bytes zusammen. Die Berechnung 
lautet also: EpochTime = 147 * 2^0 + 82 * 2^8 + 50 * 2^16 + 185 * 2^32

Ergibt mit Taschenrechner: 794572247699
Mit VB6: 3297939

Da gehen einige Stellen verloren. Habe es mit vielen Datentypen probiert 
- sogar Variant. Leider immer das gleiche Problem.
Kann man eine solche große Zahl mit einer annehmbaren Genauigkeit 
überhaupt mit VB6 ermitteln?

Danke!

lg,
Willi

von Karl H. (kbuchegg)


Lesenswert?

Deine Berechnung ist grundsätzlich ok.
Nur wirst du das Problem haben, dass VB die Berechnung im Zahlenraum 
Word (oder Integer, also 16 Bit) durchführt, während du im Zahlenraum 
DWord (oder Long) arbeiten musst.

Versuch einfach mal aus den Byte_x Werten jeweils einen DWord zu machen, 
dann sollte es eigentlich funktionieren. Wie das geht kann ich nicht 
sagen, dazu reicht meine VB6 Kenntnisse nicht mehr. Aber 
schlimmstenfalls kann man immer noch die Byte_x Variablen zunächst in 
DWord Variablen umkopieren und dann mit diesen rechnen.

von Markus (Gast)


Lesenswert?

Hi Willi,

> Die Epochezeit setzt sich aus diesen 4 Bytes zusammen. Die Berechnung
> lautet also: EpochTime = 147 * 2^0 + 82 * 2^8 + 50 * 2^16 + 185 * 2^32

Das ist leider falsch. Die Berechnung lautet EpochTime = 147 * 2^0 + 82 
* 2^8 + 50 * 2^16 + 185 * 2^24.

Gruß
Markus

von Volker Z. (vza)


Lesenswert?


von Willi S. (Gast)


Lesenswert?

Erstmals danke für die Antwort.
Es ist immer wieder sehr unangenehm, Berchnungen mit großen Zahlen 
durchzuführen. Da hatte ich schon oft immer wieder Probleme mit der 
Zahlenrepräsentation.
Ich werde mich jetzt mal weiter schlau machen. Mit deinen Tipps werde 
ich aber schon weiter kommen!

Danke!

lg,
Willi

von Willi S. (Gast)


Lesenswert?

Ok! Danke für die Richtigstellung!

1 Byte = 8 Bits

Danke!

von Willi S. (Gast)


Lesenswert?

@  Karl heinz Buchegger

DWords gibt es soviel ich weiß in VB6 gar nicht! Ich kenne nur den 
Datentyp Long. Mit Decimal müsste es gehen. Nur weiß ich nicht wirklich, 
wie man den richtig verwendet, da es ja kein Dim Variable As Decimal 
gibt.
Soviel ich weiß, hat Decimal 28 Stellen - egal ob vor oder nach dem 
Komma. Wenn ich Decimal verwenden würde, müsste eigentlich das Ergebnis 
stimmen, da ich ja eh nur ca. 18 Stellen brauche?!

lg,
Willi

von Karl H. (kbuchegg)


Lesenswert?

Willi S. schrieb:
> @  Karl heinz Buchegger
>
> DWords gibt es soviel ich weiß in VB6 gar nicht!

Ooops. Du hast recht.
Dann also Long. Wobei dann die Behandlung eines Vorzeichens noch viele 
Stunden Spass verspricht.

von Willi S. (Gast)


Lesenswert?

So! Nachdem mir da schon oft geholfen wurde und ich auch zu diesem 
Problem eine Lösung gefunden habe, möchte ich sie hier posten.

Wie ich schon erwähnt habe, hatte ich ein Problem mit der Genauigkeit 
bei den Berechnungen.
Wie ich richtig geschrieben habe, muss der Datentyp "Decimal" verwendet 
werden. Dieser Datentyp ist eigentlich ein "Stiefkind" von VB6, da er 
nicht "direkt" verwendet werden kann. Vielmehr ist er eine Untergruppe 
des Datentyps "Variant"

Auszug aus der MSDN:

Speichert 128-Bit-(16-Byte-)Werte mit Vorzeichen, die 
96-Bit-(12-Byte-)Ganzzahlen darstellen, welche mit einer variablen 
Potenz zur Basiszahl 10 skaliert werden. Der Skalierungsfaktor gibt die 
Anzahl der Stellen rechts vom Dezimalzeichen an und liegt im Bereich von 
0 bis 28. Bei einer Skalierung von 0 (keine Dezimalstellen) ist der 
größte mögliche Wert +/–79.228.162.514.264.337.593.543.950.335 
(+/-7,9228162514264337593543950335E+28). Bei 28 Dezimalstellen ist der 
größte Wert +/-7,9228162514264337593543950335, und der kleinste Wert 
ungleich 0 (null) ist +/-0.0000000000000000000000000001 (+/-1E-28).


Meine Vorgehensweise:

Dim Byte_0 As Variant
Dim Byte_1 As Variant
Dim Byte_2 As Variant
Dim Byte_3 As Variant
Dim EpochTime As Variant

EpochTime = CDec(Byte_0) + CDec(Byte_1 * 2 ^ 8) + CDec(Byte_2 * 2 ^ 16) 
+ CDec(Byte_3 * 2 ^ 24)

Und siehe da! Es kommt das richtige Ergebnis raus. Vielleicht hat jemand 
von euch mal ein ähnliches Problem und kann es dann mit meinem Beispiel 
lösen!

Danke!

lg,
Willi

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.