Я работаю над проектом флаттера, и в настоящее время у меня возникает ошибка с некоторыми строками, которые я пытаюсь декодировать с помощью метода base64.decode (). Я создал короткий код дротика, который может воспроизвести проблему, с которой я столкнулся, с определенной строкой:
import 'dart:convert';
void main() {
final message = 'RU5UUkVHQUdSQVRJU1==';
print(utf8.decode(base64.decode(message)));
}
Я получаю следующее сообщение об ошибке:
Uncaught Error: FormatException: Invalid encoding before padding (at character 19)
RU5UUkVHQUdSQVRJU1==
Я пробовал декодировать ту же строку с помощью JavaScript, и она отлично работает. Был бы рад, если бы кто-нибудь мог объяснить, почему я получаю эту ошибку, и, возможно, показать мне решение. Спасибо.


Кодировка Base64 разбивает двоичные данные на 6-битные сегменты по 3 полных байта и представляет их как печатаемые символы в стандарте ASCII. По сути, это происходит в два этапа.
Первый шаг - разбить двоичную строку на 6-битные блоки. Base64 использует только 6 бит (что соответствует 2 ^ 6 = 64 символам), чтобы обеспечить возможность печати и чтения кодированных данных. Ни один из специальных символов, доступных в ASCII, не используется.
64 символа (отсюда и название Base64) - это 10 цифр, 26 символов в нижнем регистре, 26 символов в верхнем регистре, а также знак плюса (+) и косая черта (/). Существует также 65-й символ, известный как блокнот, который является знаком равенства (=). Этот символ используется, когда последний сегмент двоичных данных не содержит полных 6 бит.
Итак, RU5UUkVHQUdSQVRJU1 == не соответствует шаблону кодировки.
Спасибо, что нашли время ответить. Но, как сказал Йозеф, я попытался расшифровать его и на других языках, и он декодировал без проблем. Также, когда я запускаю isBase64, он возвращает true, поэтому я не понимаю, почему я получаю ошибку.
@JosefZ, я немного изучил его и обнаружил, что он действительно не соответствует шаблону, возможно, дротик не настолько силен, чтобы преобразовать или понять этот хэш-ключ. вот что я нашел в dart: convert, /// Проверяет, что [_state] представляет правильное декодирование. void close (String? input, int? end) {if (_state <_encodePaddingState (0)) {throw FormatException («Отсутствует символ заполнения», input, end); } if (_state> 0) {throw FormatException («Недопустимая длина, должно быть кратно четырем», input, end); } _state = _encodePaddingState (0); }
Я возьмусь со строкой и посмотрю, что я могу сделать с кодировкой. Еще раз спасибо за ваши усилия. Я вернусь позже, когда найду решение для этого.
Вы ошибаетесь, утверждая, что
RU5UUkVHQUdSQVRJU1==не следует шаблону кодирования. В противном случае скажите мне, почемуbase64.b64decode('RU5UUkVHQUdSQVRJU1==').decode()возвращает'ENTREGAGRATIS'в Python (и работает также в.NET), а OP подтверждает, что он отлично работает в JavaScript?