Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0292: Bytes komfortabel in Bits umwandeln

 von 

Beschreibung 

VB bietet keine eigene Funktion Bytes in Bitmuster zu wandeln. Daher bleibt nur selberbasteln. Die Funktion wandelt Zahlen in bis zu 31-Bit lange Muster aus Einsen und Nullen. Die Trennung nach 4, 8,16 etc. Bits kann frei eingestellt werden. Zudem ist es möglich führende Nullen zu kappen.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

keine

Download:

Download des Beispielprojektes [2,51 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Optionsfeld-Steuerelement "Option1" (Index von 0 bis 3)
' Steuerelement: Kontrollkästchen-Steuerelement "Check1"
' Steuerelement: Textfeld "Text1"
' Steuerelement: Beschriftungsfeld "Label4"
' Steuerelement: Beschriftungsfeld "Label1"
' Steuerelement: Beschriftungsfeld "Label3"
' Steuerelement: Beschriftungsfeld "Label2"

Option Explicit

Dim BTT&

Private Sub Form_Load()
  Label1.Caption = ""
  Option1(0).Value = True
End Sub

Private Sub Text1_Change()
  Dim NoNull As Boolean
  
    NoNull = IIf((Check1.Value = vbChecked), True, False)
    Label1.Caption = GetBits(Val(Text1.Text), NoNull, 31, BTT)
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
  Dim OkStr$
    
    OkStr = "0123456789" & Chr$(8)
    If InStr(1, OkStr, Chr$(KeyAscii)) = 0 Then KeyAscii = 0
End Sub

Private Sub Option1_Click(Index As Integer)
  Select Case Index
    Case 0: BTT = 4
    Case 1: BTT = 8
    Case 2: BTT = 16
    Case 3: BTT = 31
  End Select
End Sub

Private Function GetBits(Bt As Double, Optional NoNull As Boolean _
                         = False, Optional ByVal Bits = 8, _
                         Optional BSplit = 8) As String
                         
  Dim x%, y&, aa$, bb$, First As Boolean, Cnt As Byte
    
    If Bt < 2 ^ 31 Then
      y = CLng(Bt)
      Bits = Bits - 1
      For x = Bits To 0 Step -1
        If y And 2 ^ x Then
          aa = aa & "1"
          First = True
        Else
          If Not NoNull Or First Then
          aa = aa & "0"
          End If
        End If
      Next x
      
      If Len(aa) > 1 And Len(aa) > BSplit Then
        For x = Len(aa) To 1 Step -1
          bb = Mid$(aa, x, 1) & bb
          If (Len(aa) - (x - 1)) Mod BSplit = 0 Then bb = "-" & bb
        Next x
        If Left$(bb, 1) = "-" Then bb = Mid$(bb, 2)
        aa = bb
      End If
    Else
      aa = "Überlauf"
    End If
    
    GetBits = aa
End Function
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 5 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Gregor Pappert am 20.12.2006 um 09:32

Will man nur ein spezielles Bit auslesen nimmt man am Einfachsten den And-Operator und verundet jeweils die zwei Ausdrücke.
Mal angenommen, ich will das 5.Bit auslesen, meine Zahl ist also 2^5=32
Mein Byte nenne ich Byte1, mein Vergleichsbyte Byte2, mein gewünschtes Bit einfach Bit ;-)
Hier der Code:

Private Sub Bit_aus_Byte()
Dim byte1,byte2,Ergebnis As Integer
Dim bit As Boolean

Ergebnis = byte1 And byte2

If Ergebnis = 32 Then
bit = True
Else
bit 0 False
End If

End Sub


Möchte ich alle Bits auslesen bastel ich einfach ne kurze Schleife, geht völlig problemlos...

Kommentar von Florian am 19.08.2005 um 10:57

Hier noch eine kleine Funktion welche ein Byte in acht Bits umwandelt(allerdings nur für VB .NET):

Public Function getbits(ByVal inByte As Byte) As String
Dim Testbyte As Byte = &H80
Dim bits As String
Dim i As Integer

For i = 1 To 8
If (inByte And Testbyte) = Testbyte Then
bits += "1"
Else
bits += "0"
End If
Testbyte = Testbyte >> 1
Next i

Return bits
End Function

Kommentar von am 10.12.2004 um 11:45

einfacher: (für standardumwandlungen mit 8 bits)
Private Function BitsToByte(strBits As String) As Byte
strBits = Format$(strBits, "00000000")

Dim intX As Integer

For intX = 8 To 1 Step -1
If Mid$(strBits, intX, 1) = "1" Then
BitsToByte = BitsToByte Or 2 ^ (9 - intX - 1)
End If
Next intX
End Function

Private Function ByteToBits(bytByte As Byte) As String

Dim intX As Integer

For intX = 7 To 0 Step -1
ByteToBits = ByteToBits & IIf((bytByte And 2 ^ intX) = (2 ^ intX), "1", "0")
Next intX

End Function

Kommentar von Christoph Fuest am 27.10.2003 um 11:11

Aber das in eine Bit-Zeichenfolge umrechnen einer Zahl kann man ja auch einfach so machen:

private function Binaer(Zahl as integer)
max=LOG(Zahl+1)/LOG(2)
if ((max-fix(max)) <> 0) then max = fix(max)+1
'Eigentlich "if (max mod 1 > 0) then...", aber mein wsh, wo ich's eben ausprobiert habe gibt bei mod immer null zurück...
For T = 0 to Max-1
if (2^T and Zahl) then R="1"+R else R="0"+R
next
Binaer=R
end function

Kommentar von ich am 01.06.2003 um 17:47

moin, wieso so komisch?

byte = bit * 8
*g*