Я хочу преобразовать свой массив байтов в двоичный файл, например: «01010101». С маленьким файлом он может конвертировать без каких-либо проблем, но конвертировать большой файл занимает слишком много времени (даже для всего 5 МБ, я не могу себе представить, чтобы он был больше). есть ли более быстрый способ преобразовать этот массив байтов в двоичный и наоборот? вот мой код

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
0
totallynewbie 27 Июн 2017 в 12:03

1 ответ

Лучший ответ

Вы объединяете очень большую строку в методе conv_ByteToBin. В таких случаях использовать простую конкатенацию строк - очень плохая практика, и кажется, что это ваше узкое место. Я просто изменил этот метод, чтобы использовать StringBuilder, поскольку это эффективный способ объединения больших строк, и код выполняется намного быстрее:

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

Советы по передовой практике:

  • Всегда используйте возвращаемый тип в своих методах
  • FileStream реализует iDisposable - всегда используйте блок using с объектами, реализующими iDisposable

Также ваш метод conv_FileToByte не имеет значения, поскольку .net уже встроен в File.ReadAllBytes - метод, который делает то же самое. Просто вызовите это и удалите свою собственную реализацию.

2
Esko 27 Июн 2017 в 12:22
Спасибо, это решило мою проблему! Я не знал, что это так просто.
 – 
totallynewbie
28 Июн 2017 в 11:15