是否有可能使用VB.Net BinaryWriter从文件中存储/检索位数据?

问题描述:

好吧,我需要从3.268.760位长的数据表中存储/检索一个位。是否有可能使用VB.Net BinaryWriter从文件中存储/检索位数据?

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 

w.write(?)存储布尔值,这意味着0/1的假/真值,但Vb.net似乎使用全字节来存储这些数据这是我的表(3.268.760^2太贵)

有没有一种实用的方法来存储/检索使用vb.net文件的单个位? (尽可能少地转换为其他类型)。

包装BinaryReader/Writer可能是您最好的选择。

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 

,并读取位背

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

似乎合理的,我@Thomas,但如何**事后retrive **数据(一个更完整的答案)。 – 2012-04-11 14:08:38

+0

我编辑了我的答案,以清楚它包含两个类(并将它清理了一下) – Thomas 2012-04-11 14:22:33

+0

那么你的anwers是可行的,但非常规的数字是非常巨大的意思,即使存储它,它会要求1.336Tb。但我可能会找到解决方法... – 2012-04-12 01:59:32