2012-04-11 10 views
0

私は、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は私のテーブルのためにあまりにも高価である。このデータを保存するために、全体のバイトを使用しているようです(^ 2 3.268.760 )

vb.netを使用してファイルから単一のビットを保存/取得する手のひらな方法はありますか? (できるだけ他のタイプへの変換を意味する)。

答えて

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 
+0

が@Thomas私には合理的なようだが、**(より完全な答えに)、その後**データをretriveする方法。 –

+0

私は2つのクラスが含まれていることを明確にするために自分の答えを編集しました(そしてそれを少しきれいにしました)。 – Thomas

+0

あなたのアンワースは厳格ですが、無礼ですが、数字は本当に巨大でビットとして保存しても1.336Tbです。しかし、私は周りの仕事を見つけることができる... –

関連する問題