Rubrik: Variablen/Strings · Sonstiges | VB-Versionen: VB6 | 25.06.08 |
DWords und QWords QWords (64 Bit) in Lo und Hi DWord aufteilen sowie ein QWord aus zwei DWords bilden | ||
Autor: Arne Elster | Bewertung: | Views: 8.870 |
actorics.de/rm_code | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
VB Classic hat leider keinen 64 Bit Integer Datentyp, allerdings versteckt sich im Variant der Typ "Decimal", der groß genug ist, um diese Zahlen aufzunehmen. Mit einfacher Arithmetik lassen sich DWords so umrechnen, dass sie als QWords in Decimals dargestellt werden können.
Folgende zwei Funktionen zeigen, wie das geht:
' lngLo: untere 32 Bits ' lngHi: obere 32 Bits ' signed: hat ein Vorzeichen Private Function To64BitInt(ByVal lngLo As Long, ByVal lngHi As Long, _ Optional ByVal signed As Boolean = True) As Variant Dim value As Variant If (lngLo And &H80000000) Then value = CDec(lngLo And &H7FFFFFFF) + CDec(2147483648#) Else value = CDec(lngLo) End If If (Not signed) And (lngHi And &H80000000) Then lngHi = lngHi And &H7FFFFFFF value = value + (CDec(lngHi) + CDec(2147483648#)) * CDec(4294967296#) Else value = value + CDec(lngHi) * CDec(4294967296#) End If To64BitInt = value End Function
' value: QWord ' lngLo: untere 32 Bits ' lngHi: obere 32 Bits Private Sub From64BitInt(ByVal value As Variant, _ ByRef lngLo As Long, ByRef lngHi As Long) Dim varLo As Variant, varHi As Variant varHi = Int(value / CDec(4294967296#)) varLo = value - (varHi * CDec(4294967296#)) If varHi >= 2147483648# Then lngHi = (varHi - 2147483648#) Or &H80000000 Else lngHi = varHi End If If varLo >= 2147483648# Then lngLo = (varLo - 2147483648#) Or &H80000000 Else lngLo = varLo End If End Sub
Kleines Beispiel zur Funktionsweise:
Private Sub Form_Load() Dim qword As Variant Dim lo_dword As Long Dim hi_dword As Long ' aus 2 DWords ein QWord bilden lo_dword = &HFFFFFFFF hi_dword = &HFFFFFFFF ' = 2 ^ 64 - 1 = 18446744073709551615 ' würde man für den Parameter "signed" true übergeben, ' wäre das Ergebnis -1 qword = To64BitInt(lo_dword, hi_dword, False) MsgBox qword ' aus dem QWord wieder 2 DWords machen From64BitInt qword, lo_dword, hi_dword MsgBox Hex$(hi_dword) & " " & Hex$(lo_dword) ' = FFFFFFFF FFFFFFFF End Sub