Я хочу преобразовать свой массив байтов в двоичный файл, например: «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
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 - метод, который делает то же самое. Просто вызовите это и удалите свою собственную реализацию.
Похожие вопросы
Новые вопросы
arrays
Массив - это упорядоченная линейная структура данных, состоящая из набора элементов (значений, переменных или ссылок), каждый из которых идентифицируется одним или несколькими индексами. Когда вы спрашиваете о конкретных вариантах массивов, используйте вместо них следующие связанные теги: [vector], [arraylist], [matrix]. При использовании этого тега в вопросе, относящемся к языку программирования, пометьте вопрос используемым языком программирования.