Преобразование Base64 в строку вставляет пробелы - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь преобразовать строку в кодировке Base64 в текст.Я использую следующий код:

public static string Base64Decode(string base64EncodedData)
{
    var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
    return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}

Каким-то образом это работает, но ставит пробелы после каждого символа. Кроме того, он добавляет недопустимый символ в начале преобразованной строки.Содержимое в строке Base64 представляет собой XML, поэтому, когда он преобразует его в текст и помещает пробелы, он становится недействительным.Есть ли альтернатива этому?

вот пример выходных данных после преобразования:

? < ? x m l  v e r s i o n = " 1 . 0 "  e n c o d i n g = " U T F - 1 6 "  s t a n d a l o n e = " n o " ? >   < I m p o r t >     < o p t i o n s >       < P r o c N a m e > E R P N u m b e r < / P r o c N a m e >       < J o b I D > A N L 0 0 1 8 5 0 < / J o b I D >     < / o p t i o n s >     < R o w >       < D o c I d  / >       < E R P N u m b e r  / >     < / R o w >   < / I m p o r t > 

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Как Джон Скит объяснил в своем ответе , строка представляется закодированной в UTF-16, а не в UTF-8.

Вы также написали

Кроме того, он добавляет недопустимый символ в начало преобразованной строки.

Этот недопустимый символ почти наверняка является знак порядка байтов , небольшая предварительная последовательность байтов, которая указывает конкретное кодирование, используемое в потоке.Учитывая его наличие, вы можете настроить StreamReader для обнаружения указанной кодировки с помощью конструктора new StreamReader(Stream, true):

public static string Base64Decode(string base64EncodedData)
{
    var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
    using (var reader = new StreamReader(new MemoryStream(base64EncodedBytes), true))
    {
        return reader.ReadToEnd();
    }
}

Обратите внимание, что StreamReader будет использовать порядок байтовпометить во время обработки, чтобы он не был включен в возвращаемую строку.

В качестве альтернативы, поскольку ваши данные base64 на самом деле являются XML, а XML содержит собственное объявление кодировки , вы можете извлечь массив байтов ипроанализируйте его напрямую, используя XmlReader:

public static XmlReader CreateXmlReaderFromBase64(string base64EncodedData, XmlReaderSettings settings = null)
{
    var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
    return XmlReader.Create(new MemoryStream(base64EncodedBytes), settings);
}

В соответствии с документами , XmlReader.Create(Stream) будет определять кодировку по мере необходимости:

Сканирование XmlReaderпервые байты потока ищут метку порядка байтов или другой знак кодирования.Когда кодирование определено, кодирование используется для продолжения чтения потока, и обработка продолжает анализировать входные данные как поток символов (Unicode).

0 голосов
/ 02 октября 2018

Похоже, что исходные двоичные данные - это строки, преобразованные в байты с использованием UTF-16, который соответствует части текста encoding="UTF-16".Вы должны использовать правильную кодировку при преобразовании двоичных данных обратно в строку:

return Encoding.Unicode.GetString(base64EncodedBytes);

Это предполагает, что вы не можете изменить то, что производит данные в первую очередь.Если вы можете изменить это на использование UTF-8, вы получите вдвое меньше данных, если текст будет содержать все символы ASCII ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...