VB.NET неправильно кодирует один символ - PullRequest
2 голосов
/ 16 июня 2010

У меня есть байтовый массив, который я кодирую в строку:

Private Function GetKey() As String
    Dim ba() As Byte = {&H47, &H43, &H44, &H53, &H79, &H73, &H74, &H65, &H6D, _
                        &H73, &H89, &HA, &H1, &H32, &H31, &H36}

    Dim strReturn As String = Encoding.ASCII.GetString(ba)

    Return strReturn
End Function

Затем я записываю это в файл через IO.File.AppendAllText. Если я открою этот файл в редакторе 010 (для просмотра двоичных данных), он отобразится так:

47 43 44 53 79 73 74 65 6D 73 3F 0A 01 32 31 36

Исходный байтовый массив содержал 89 в позиции 11, а закодированная строка содержит 3F . Если я изменю свою кодировку на Encoding.Default.GetString, это даст мне:

47 43 44 53 79 73 74 65 6D 73 E2 80 B0 0A 01 32 31 36

Любая помощь будет высоко ценится!

1 Ответ

2 голосов
/ 16 июня 2010

Encoding.ASCII ограничен 7-битными символами. Это байтовые значения от 0 до 127 (от & H00 до & H7F). GetString устанавливает все значения вне этого диапазона в & H3F, что является вопросительным знаком.

Encoding.Default - это текущая кодовая страница ANSI для операционной системы, которая на моем компьютере - CodePage 1252 ..

Кодовые страницы ANSI могут отличаться на разных компьютерах, или может быть поменял на один компьютер, ведущий к повреждению данных. Для большинства последовательные результаты, приложения следует использовать Unicode, например UTF-8 (кодовая страница 65001) или UTF-16 вместо конкретной кодовой страницы.

Encoding.UTF7 будет работать для вас здесь:

Dim strReturn As String = Encoding.UTF7.GetString(ba)

Edit:

Вместо кодирования я бы записывал байты напрямую, используя что-то вроде этого:

Dim key = GetKey()
Dim f = System.IO.File.OpenWrite("output.txt")
f.Seek(0, SeekOrigin.End)
f.Write(key, 0, key.Length)
f.Close()

Private Function GetKey() As String
  Dim ba() As Byte = {&H47, &H43, &H44, &H53, &H79, &H73, &H74, &H65, &H6D, &H73, &H89, &HA, &H1, &H32, &H31, &H36}

  Return ba
End Function
...