02. juni 2006 - 13:59Der er
14 kommentarer og 2 løsninger
læse binær fil bit for bit
Hej eksperter
Jeg er ved at lave et lille program der henter informationer fra binære filer. Filerne er opbygget således at de første 22 bit i hver "linie" bestemmer hvad der skal læses fra resten af linien - Altså som en slags "bitmap" hvor et flag i bit nr 5, 7 og 11 betyder at variabel 5, 7 og 11 findes i den efterfølgende linie og skal læses.. hvorefter der så kommer en ny "bitmap"
Jeg kan imidlertidig ikke finde ud af at læse "bitmap´en" direkte. I øjeblikket oversætter jeg talværdien for bitstrengen til binær igen og bruger den til at finde ud af hvilke variable der skal læses.. Det må da kunne lade sig gøre at læse bitstrengen/bitmappen direkte??
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
Noget i den stil.. så skal du bare loppe alle dine byte eller Bit igennem..
Option Explicit
Private Sub Form_Load() Dim strBit As String strBit = ByteToBit(65) ' 65 = Asc("A") MsgBox "Byte2Bit: " & strBit ' 1 byte = 8 Bit MsgBox "Bit2Byte: " & BitToByte(strBit) End Sub
Public Function BitToByte(ByVal strBin As String) As Byte Dim i As Integer For i = 8 To 1 Step -1 Select Case Mid$(strBin, i, 1) Case "1", 1 BitToByte = BitToByte + (2 ^ (8 - i)) End Select Next End Function
Public Static Function ByteToBit(ByVal byt1 As Byte) As String Dim i As Integer Dim strByte(0 To 255) As String * 8 If i Then ByteToBit = strByte(byt1) Else For i = 0 To 255 strByte(i) = ExByteToBit(i) Next ByteToBit = strByte(byt1) End If End Function
Private Function ExByteToBit(ByVal byt1 As Byte) As String ExByteToBit = "00000000" If byt1 And &H1& Then MidB$(ExByteToBit, 15&) = "1" If byt1 And &H2& Then MidB$(ExByteToBit, 13&) = "1" If byt1 And &H4& Then MidB$(ExByteToBit, 11&) = "1" If byt1 And &H8& Then MidB$(ExByteToBit, 9&) = "1" If byt1 And &H10& Then MidB$(ExByteToBit, 7&) = "1" If byt1 And &H20& Then MidB$(ExByteToBit, 5&) = "1" If byt1 And &H40& Then MidB$(ExByteToBit, 3&) = "1" If byt1 And &H80& Then MidB$(ExByteToBit, 1&) = "1" End Function
Private Sub Form_Load() Dim strBit As String strBit = ByteToBit(65) ' 65 = Asc("A") MsgBox "Byte2Bit: " & strBit ' 1 byte = 8 Bit MsgBox "Bit2Byte: " & BitToByte(strBit) End Sub
Public Function BitToByte(ByVal strBin As String) As Byte Dim i As Integer For i = 8 To 1 Step -1 Select Case Mid$(strBin, i, 1) Case "1", 1 BitToByte = BitToByte + (2 ^ (8 - i)) End Select Next End Function
Public Function ByteToBit(ByVal byt1 As Byte) As String ByteToBit = "00000000" If byt1 And &H1& Then MidB$(ByteToBit, 15&) = "1" If byt1 And &H2& Then MidB$(ByteToBit, 13&) = "1" If byt1 And &H4& Then MidB$(ByteToBit, 11&) = "1" If byt1 And &H8& Then MidB$(ByteToBit, 9&) = "1" If byt1 And &H10& Then MidB$(ByteToBit, 7&) = "1" If byt1 And &H20& Then MidB$(ByteToBit, 5&) = "1" If byt1 And &H40& Then MidB$(ByteToBit, 3&) = "1" If byt1 And &H80& Then MidB$(ByteToBit, 1&) = "1" End Function
Jef er lige på vej ud af døren.. Og jeg kommer nok ikke til computeren i weekenden - ingen netforbindelse i sommerhuset forstås... , men jeg kigger lige på det først i næste uge.
Jeg er skam ikke ude efter point på denne her. Men, ellers tak for tilbudet. :^)
Det undrede mig bare at jeffee spørger efter en måde at læse fra filen bit-for-bit, og så alligevel er tilfreds over at for en byte-til-bit konverterings rutine; Umiddelbart lød spørgsmålet som om at der allerede var tjek på dette?
Beklager jeg ikke lige har været ved computeren så jeg har kunne kigge på svarene.. Nielle har forstået rigtigt at det er konversionen fra byte til bit jeg gerne vil udenom.. Den fil jeg læser er en binær fil, hvor hver linie starter med en 22 bit streng der fortæller hvilke variable der er tilstedeværende i den pågældende linie.. Hver bit repræsenterer en variabel... Grunden til at filen ser således ud er at man så bliver fri for at skrive alle variable hver gang. Det er nemlig kun de variable der er anderledes end den foregående linie der angives. På den måde reduceres filstørrelsen krafigt, da størstedelen af de variable kun sjældent ændres fra linie til linie.. I første linie i filen vil de 22 bit dermed altiod være "tændte" og dermed findes alle 22 variable efterfølgende i linien, men derefter er kun de bit i strengen sat for hvilke den tilknyttede variable er ændret i forhold til den forrige linie.
Nej, det er ikke spor kryptisk, men svaret er fortsat det samme: Der findes i VB (mig bekendt) ikke nogen mulighed for at læse en fil på et mere findelt niveau end en enkelt byte af gangen.
Jeg tror dog ikke at du skal bekymre dig alt for meget om tabt regnekraft. Selv på maskinsprogs-niveau læses der på byte-niveau som det fineste. Faktisk er det endda mere effektivt at læse på word-niveau (2 bytes) ... eller sådan har det i hvert fald været engang. Hvis Fortran kan læse på bit-niveau, så må dette trick nødvendigvis ske ved at læse bytes og så trække bitsene ud af disse; Fortran kamouflere m.a.o. det som du selv ville gøre i din VB kode, og den bruger derfor den samme regnekraft til formålet.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.