VB.Net — Кодирование строки в шестнадцатеричный формат

#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