vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Variablen/Strings · Sonstiges   |   VB-Versionen: VB625.06.08
DWords und QWords

QWords (64 Bit) in Lo und Hi DWord aufteilen sowie ein QWord aus zwei DWords bilden

Autor:   Arne ElsterBewertung:  Views:  8.870 
actorics.de/rm_codeSystem:  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



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.