2012-04-11 7 views
0

Ok, ich muss ein Bit aus einer Datentabelle von 3.268.760 Bits lang speichern/abrufen.Ist es möglich, Bitdaten aus einer Datei mit VB.Net BinaryWriter zu speichern/abzurufen?

Using w As New BinaryWriter(File.Open("test.bin", FileMode.Create)) 
    for x = 1 to 3268760 
     For i = 1 To 3268760 
      w.Write(countBits(bitLikeness(u(i), u(x))) > 10) 
     Next 
    Next 
End Using 

die w.write(?) speichert ein boolean Wert 0/1 für false/wahre Werte Sinn, aber Vb.net scheint ein ganzes Byte zu verwenden, um diese Daten zu speichern, die für meinen Tisch zu teuer ist (3.268.760^2)

Gibt es eine praktische Möglichkeit, einzelne Bits aus einer Datei mit vb.net zu speichern/retrive? (das heißt, so wenig wie möglich in andere Typen konvertieren).

Antwort

1

Wrapping der BinaryReader/Writer ist wahrscheinlich die beste Option.

Public Class BitWriter 

    Private ReadOnly mBinaryWriter As BinaryWriter 

    Private mBuffer As Integer 
    Private mBufferCount As Integer 

    Public Sub New(binaryWriter As BinaryWriter) 
     mBinaryWriter = binaryWriter 
    End Sub 

    Public Sub WriteBit(bit As Boolean) 

     If mBufferCount = 32 Then 

      mBinaryWriter.Write(mBuffer) 

      mBuffer = 0 
      mBufferCount = 0 

     End If 

     If bit Then mBuffer = mBuffer Or (1 << mBufferCount) 

     mBufferCount += 1 

    End Sub 

    Public Sub Flush() 

     mBinaryWriter.Write(mBuffer) 

     mBuffer = 0 
     mBufferCount = 0 

    End Sub 

End Class 

und die Bits zu lesen zurück

Public Class BitReader 

    Private ReadOnly mBinaryReader As BinaryReader 

    Private mBuffer As Integer 
    Private mBufferCount As Integer 

    Public Sub New(binaryReader As BinaryReader) 
     mBinaryReader = binaryReader 
     mBuffer = -1 
    End Sub 

    Public Function ReadBit() As Boolean 

     If mBuffer = -1 OrElse mBufferCount = 8 Then 

      mBuffer = mBinaryReader.ReadInt32() 
      mBufferCount = 0 

     End If 

     Dim toReturn As Boolean = ((mBuffer >> mBufferCount) And 1) = 1 

     mBufferCount += 1 

     Return toReturn 

    End Function 

End Class 
+0

Scheint mir @Thomas vernünftig, aber wie ** Daten ** retrive danach (auf eine vollständigere Antwort). –

+0

Ich habe meine Antwort bearbeitet, um klar zu stellen, dass sie zwei Klassen enthält (und sie ein wenig aufgeräumt hat). – Thomas

+0

Nun, Ihre Antwort ist richtig, aber unfornatelly die Zahl ist wirklich riesig, was sogar das Speichern als Bits es würde 1,336Tb requeire. Aber ich kann eine Arbeit finden ... –