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
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.
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
Hilft dir das: http://www.vbdotnetheaven.com/Blogs/BlogDetail.aspx?BlogId=1462 1 Minute mit Gooogle.
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
@ 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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.