是否有可能使用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
似乎合理的,我@Thomas,但如何**事后retrive **数据(一个更完整的答案)。 – 2012-04-11 14:08:38
我编辑了我的答案,以清楚它包含两个类(并将它清理了一下) – Thomas 2012-04-11 14:22:33
那么你的anwers是可行的,但非常规的数字是非常巨大的意思,即使存储它,它会要求1.336Tb。但我可能会找到解决方法... – 2012-04-12 01:59:32