2015-02-23 1 views

ответ

7

Вы вызываете перегрузку Decode, которая принимает текст с кодировкой base64 и возвращает строку. Способ, которым реализуется метод Decode, является следующим:

  1. Декодировать base64 в двоичном формате.
  2. Обработать двоичный код как кодированный текст UTF-8.
  3. Декодирование байтов UTF-8 в текст.

Ваше сообщение об ошибке указывает, что двоичный код, который является результатом этапа 1, недействителен UTF-8. Для того, чтобы понять, почему это так, требуется знание того, откуда возник код с кодировкой base64.

Ваш текущий код предполагает, что следующий процесс прошел для создания в формате base64 значение:

  1. Encode некоторый текст в UTF-8 байт.
  2. Base 64 кодирует эти байты.

Проблема не обязательно в коде для декодирования. Проблема в том, что ваше декодирование не соответствует процессу, который первоначально был закодирован. Ошибка может лежать либо в исходной кодировке, либо в декодировании. Вам нужно проверить, как кодировалось значение base64. Был ли он закодирован с использованием описанных выше шагов?

Если бы я должен был догадаться, я бы предположил, что исходные данные на самом деле не были текстовыми. Я предполагаю, что исходные данные двоичные, то есть поток байтов. Я подозреваю, что вы начали с кода, который содержал двоичные данные в переменной AnsiString. Очень часто встречается код Delphi, который таким образом злоупотребляет строками. По историческим соображениям, похоже, было записано в знания, что AnsiString может использоваться для хранения двоичных данных. Я думаю, все это началось, когда Delphi 2 представил AnsiString и в то время не было динамических массивов.

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

var 
    bytes: TBytes; 
.... 
bytes := TNetEncoding.Base64.DecodeStringToBytes(...); 

, чтобы декодировать значение base64 в двоичном формате.

Итак, предположим, что base64, который у вас есть, является фактически ANSI-кодированным текстом. Тогда бы вы расшифровать так:

var 
    bytes: TBytes; 
    text: string; 
.... 
bytes := TNetEncoding.Base64.DecodeStringToBytes(...); 
text := TEncoding.ANSI.GetString(bytes); 

Это предполагает преобладающую страницу ANSI код на компьютере, на котором вы дешифровать.Если вам необходимо указать страницу ANSI-код, то вы можете написать это:

var 
    bytes: TBytes; 
    text: string; 
    Encoding: TEncoding; 
.... 
bytes := TNetEncoding.Base64.DecodeStringToBytes(...); 
Encoding := TEncoding.GetEncoding(CodePage); 
try 
    text := Encoding.GetString(bytes); 
finally 
    Encoding.Free; 
end; 

Как вы можете видеть, я теперь сводится к угадываю. Если вы хотите добиться прогресса, вы узнаете, как ваши данные были закодированы.

+0

Так может ли он работать, если я сам сделаю 3 шага? Пример: 1. Расшифруйте base64 в двоичном формате. 2. Определите кодировку двоичного кода. 3. Выберите метод для декодирования. Как это можно сделать в коде? Или есть другой метод base64-decode, который не имеет этого ограничения TNetEncoding? – user1580348

+0

'TNetEncoding' не ограничен. Вам нужно знать, как было закодировано исходное значение. Это ваш следующий шаг. У меня такое чувство, что вы не совсем понимаете, что такое base64. Вы понимаете, что base64 кодирует бинарный текст и декодирует текст в двоичный? Я спрашиваю об этом, потому что считаю важным установить некоторые общие основания. –

+0

Я понимаю, что такое base64. Проблема заключается в следующем: текст base64, который я пытаюсь декодировать, был создан неизвестным экземпляром, а не мной. Поэтому я не знаю, как это было закодировано. Однако, если я декодирую его с помощью одного из многих онлайн-декодеров base64, он будет декодироваться без проблем. – user1580348

 Смежные вопросы

  • Нет связанных вопросов^_^