2017-06-27 10 views
0

私はbytearrayをこのようなバイナリに変換したい: "01010101"。小さなファイルであれば問題なく変換できますが、大きなファイルを変換するには時間がかかりすぎます(5MBでも大丈夫です)。このbytearrayをバイナリに変換する方法はありますか? は、ここであなたがconv_ByteToBin法では非常に大きな文字列を連結している私のコードバイト配列をvbでバイナリに変換するより高速な方法は?

Public Function conv_FileToByte(ByVal filename As String) 

    Dim convFileToByte_array() As Byte 
    Dim fs As New FileStream(filename, FileMode.Open, FileAccess.Read) 
    Dim fileData As Byte() = New Byte(fs.Length - 1) {} 

    Console.WriteLine("reading file data") 
    fs.Read(fileData, 0, Convert.ToInt32(fs.Length)) 
    fs.Close() 
    Console.WriteLine("close stream") 


    convFileToByte_array = fileData 

    Console.WriteLine("Returning value") 

    Return convFileToByte_array 

End Function 


Public Function conv_ByteToBin(ByVal conv() As Byte) 

    'Dim newBin As New List(Of String) 
    Dim newBin As String = Nothing 
    For Each c In conv 
     'newBin.Add(Convert.ToString(c, 2).PadLeft(8, "0")) 
     Dim temp_bin As String 
     temp_bin = Convert.ToString(c, 2).PadLeft(8, "0") 
     newBin = newBin & temp_bin 
    Next 
    Console.WriteLine("Returning value") 

    Return newBin 
End Function 


Public Function conv_BinToByte(ByVal binValue As String) 


    Dim count_binValue As String = binValue.Count 

    Dim temp_binValue As New List(Of String) 


    Dim bins As New Byte() 
    Dim binlist As New List(Of Byte) 

    For i As Integer = 0 To count_binValue - 1 Step 8 


     Dim temp_value As String 
     temp_value = binValue.Substring(i, 8) 


     Dim convert_temp As String 

     convert_temp = Convert.ToInt32(temp_value, 2) 

     temp_binValue.Add(convert_temp) 
    Next 

    For Each bl In temp_binValue 
     binlist.Add(bl) 
    Next 


    Dim binData As Byte() = New Byte(binlist.Count - 1) {} 
    For bd As Integer = 0 To binlist.Count - 1 
     binData(bd) = binlist(bd) 
    Next 

    Return binData 

End Function 

答えて

2

です。そのような場合、基本的な文字列を連結することは非常に悪い習慣であり、これがあなたのボトルネックになっているようです。

Public Function conv_ByteToBin(ByVal conv() As Byte) As String 
    Dim newBin As New StringBuilder 

    For Each c In conv 
     newBin.Append(Convert.ToString(c, 2).PadLeft(8, "0")) 
    Next 
    Console.WriteLine("Returning value") 

    Return newBin.ToString 
End Function 

ベスト・プラクティスのヒント:

  • は常にあなたの方法で戻り値の型を使用し、私は単にそれがはるかに速く、大きな文字列と多くのコードの実行を連結するための効率的な方法だとして、方法はStringBuilderのを使用することを変更しました
  • FileStream IDisposableインターを実装 - 常にあなたの方法conv_Filまた、IDisposableを

を実装するオブジェクトでブロックを使用して使用します.netはすでにFile.ReadAllBytesのメソッドを組み込んでいるので、eToByteは無関係です。それを呼び出して、独自の実装を削除してください。

+0

ありがとう、これは私の問題を解決!私はそれがこの単純なことを知らなかった。 – totallynewbie

関連する問題