Вы вызываете перегрузку Decode
, которая принимает текст с кодировкой base64 и возвращает строку. Способ, которым реализуется метод Decode
, является следующим:
- Декодировать base64 в двоичном формате.
- Обработать двоичный код как кодированный текст UTF-8.
- Декодирование байтов UTF-8 в текст.
Ваше сообщение об ошибке указывает, что двоичный код, который является результатом этапа 1, недействителен UTF-8. Для того, чтобы понять, почему это так, требуется знание того, откуда возник код с кодировкой base64.
Ваш текущий код предполагает, что следующий процесс прошел для создания в формате base64 значение:
- Encode некоторый текст в UTF-8 байт.
- 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;
Как вы можете видеть, я теперь сводится к угадываю. Если вы хотите добиться прогресса, вы узнаете, как ваши данные были закодированы.
Так может ли он работать, если я сам сделаю 3 шага? Пример: 1. Расшифруйте base64 в двоичном формате. 2. Определите кодировку двоичного кода. 3. Выберите метод для декодирования. Как это можно сделать в коде? Или есть другой метод base64-decode, который не имеет этого ограничения TNetEncoding? – user1580348
'TNetEncoding' не ограничен. Вам нужно знать, как было закодировано исходное значение. Это ваш следующий шаг. У меня такое чувство, что вы не совсем понимаете, что такое base64. Вы понимаете, что base64 кодирует бинарный текст и декодирует текст в двоичный? Я спрашиваю об этом, потому что считаю важным установить некоторые общие основания. –
Я понимаю, что такое base64. Проблема заключается в следующем: текст base64, который я пытаюсь декодировать, был создан неизвестным экземпляром, а не мной. Поэтому я не знаю, как это было закодировано. Однако, если я декодирую его с помощью одного из многих онлайн-декодеров base64, он будет декодироваться без проблем. – user1580348