#vb.net
#vb.net
Вопрос:
это мой код для преобразования строки в шестнадцатеричный формат
Function StringToHex(ByVal text As String) As String
Dim xhex As String
For i As Integer = 0 To text.Length - 1
xhex amp;= Asc(text.Substring(i, 1)).ToString("x").ToUpper
Next
Return xhex
End Function
Я конвертирую строковый файл в шестнадцатеричный с помощью этого кода, но если размер файла превышает 1 МБ, моя программа не отвечает
, как сделать этот код более эффективным для файла размером более 1 МБ, извините, мой английский плохой
Комментарии:
1. Использование
StringBuilder
помогло бы. Прямо сейчас вы создаете новуюxhex
строку каждый раз, когда проходите цикл. Это очень неэффективно.2. Теперь, когда я снова смотрю на это, вы пробовали
text.ToString("x").ToUpper()
и посмотрите, что получится?3. обратите внимание на ошибку «Исключение первого случая типа ‘System. InvalidCastException’ произошло в шестнадцатеричном Converter.exe »
4. на python это похоже на этот text.encode(«шестнадцатеричный»), но как на vb net? Я застрял на этом этапе: (
Ответ №1:
Как я уже говорил в своем первоначальном комментарии, ваш текущий подход заключается в создании новой строки каждый раз, когда вы проходите цикл For . Строки неизменяемы (не могут быть изменены) в .NET — так, например, если у вас 3000 символов в строке, xHex = amp;a
будет создано 3000 строк, и это только для первой части. Затем у вас есть a Substring
, затем a ToString
и, наконец, a ToUpper
— так что, если моя математика верна, вы создаете 4 строки для каждого символа во входной строке (так что, если у вас 3000 символов, это 12 000 дополнительных строк).
Вызов Substring
не требуется — вы можете обрабатывать строку как массив и обращаться к каждому символу в строке как к индексу массива, так что теперь у вас будет:
xhex amp;= Asc(text(i)).ToString("x").ToUpper
Вы также можете избавиться от вызова .ToUpper()
, используя прописную букву «X» в вызове .ToString()
— так что теперь у вас есть:
xhex amp;= Asc(text(i)).ToString("X")
Вы также можете создать xhex
StringBuilder
, и тогда вы будете создавать только одну дополнительную строку каждый раз в цикле (вызов to .ToString()
). Объединение всего этого дает вам следующее:
Dim xhex As StringBuilder = New StringBuilder()
For i As Integer = 0 To text.Length - 1
xhex.Append(Asc(text(i).ToString("X"))
Next
Return xhex.ToString()
Это может помочь в процессе, но если строка действительно большая, у вас все равно могут возникнуть проблемы с памятью. ЕСЛИ файл действительно большой, я бы рекомендовал читать его с помощью a Stream
и обрабатывать по Stream
одному байту за раз (или по несколько байтов за раз, на ваш выбор).
Я бы также предложил поискать в Google VB.NET преобразуйте строку в шестнадцатеричный формат, так как существует множество примеров других способов сделать это.
Комментарии:
1. какой-то код не соответствует, но я уже исправил это … xhex. Добавить(Asc(текст (i)). toString(«X»)) и Dim xhex Как новый System.Text.StringBuilder Большое вам спасибо: D