【问题标题】:Is it possible store/retrieve bit data from file using VB.Net BinaryWriter?是否可以使用 VB.Net BinaryWriter 从文件中存储/检索位数据?
【发布时间】:2012-04-11 06:26:40
【问题描述】:

好的,我需要从 3.268.760 位长的数据表中存储/检索一些位。

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 从文件中存储/检索单个位? (意味着尽可能少地转换为其他类型)。

【问题讨论】:

    标签: vb.net binary data-storage


    【解决方案1】:

    包装 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 对我来说似乎很合理,但之后如何检索数据(以获得更完整的答案)。
    • 我编辑了我的答案以明确它包含两个类(并对其进行了一些清理)
    • 好吧,您的回答是正确的,但不幸的是,这个数字确实很大,这意味着即使将其存储为比特也需要 1.336Tb。但我可能会找到解决办法...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多