2017-06-27 4 views
0

Ich möchte mein Bytearray wie folgt in eine binäre konvertieren: "01010101". Mit einer kleinen Datei kann es ohne Probleme konvertieren, aber es dauert zu lange, um eine große Datei zu konvertieren (selbst für nur 5 MB, kann ich mir nicht vorstellen, dass es größer ist). Gibt es einen schnelleren Weg, um dieses Bytearray in Binär und umgekehrt umzuwandeln? hier ist mein Codeschnellere Möglichkeit, Byte-Array in Binärdatei in Vb zu konvertieren?

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 

Antwort

2

Sie sind sehr große Zeichenfolge in conv_ByteToBin-Methode verketten. In solchen Fällen ist es sehr schlecht, grundlegende Verkettungen zu verwenden und es scheint, dass dies Ihr Engpass ist. Ich änderte einfach die Methode Stringbuilder zu verwenden, da es eine effiziente Methode ist große Strings und der Code läuft viel zu verketten, viel schneller:

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 

Best Practices-Tipps:

  • immer Rückgabetyp in Ihren Methoden verwenden
  • FileStream IDisposable implementiert - immer mit Block mit Objekten verwenden, die IDisposable implementieren

auch Ihre Methode conv_Fil eToByte ist irrelevant, da .net bereits in File.ReadAllBytes integriert ist - Methode, die das Gleiche tut. Rufen Sie das einfach an und entfernen Sie Ihre eigene Implementierung.

+0

danke, das hat mein Problem gelöst! Ich wusste nicht, dass es so einfach ist. – totallynewbie

Verwandte Themen