base64.decode: Недопустимая кодировка перед заполнением

#string #flutter #dart #base64 #decode

#строка #трепетание #дротик #base64 #декодировать

Вопрос:

Я работаю над проектом flutter, и в настоящее время я получаю сообщение об ошибке с некоторыми строками, которые я пытаюсь декодировать с помощью метода base64.decode() . Я создал короткий код dart, который может воспроизвести проблему, с которой я сталкиваюсь, с определенной строкой:

 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, и она работает нормально. Был бы рад, если бы кто-нибудь мог объяснить, почему я получаю эту ошибку, и, возможно, показать мне решение. Спасибо.

Ответ №1:

Кодирование Base64 разбивает двоичные данные на 6-битные сегменты по 3 полных байта и представляет их как печатные символы в стандарте ASCII. Он делает это по существу в два этапа.

Первый шаг — разбить двоичную строку на 6-битные блоки. Base64 использует только 6 бит (что соответствует 2 ^ 6 = 64 символам), чтобы гарантировать, что закодированные данные доступны для печати и удобочитаемы. Ни один из специальных символов, доступных в ASCII, не используется.

64 символа (отсюда и название Base64) — это 10 цифр, 26 символов нижнего регистра, 26 символов верхнего регистра, а также знак плюс ( ) и косая черта (/). Существует также 65-й символ, известный как pad, который является знаком равенства (=). Этот символ используется, когда последний сегмент двоичных данных не содержит полных 6 бит

Таким образом, RU5UUkVHQUdSQVRJU1== не соответствует шаблону кодирования.

Комментарии:

1. Вы ошибаетесь, утверждая, что RU5UUkVHQUdSQVRJU1== это не соответствует шаблону кодирования. В противном случае, скажите мне, почему base64.b64decode('RU5UUkVHQUdSQVRJU1==').decode() возвращает 'ENTREGAGRATIS' в Python (и работает в .NET том числе), а OP подтверждает, что он отлично работает в JavaScript?

2. Спасибо, что нашли время ответить. Но, как сказал Джозеф, я пытался декодировать его и на других языках, и он декодировался без проблем. Также, когда я запускаю isBase64, он возвращает true, поэтому я не понимаю, почему я получаю ошибку.

3. @JosefZ, я немного изучил ее и обнаружил, что она действительно не соответствует шаблону, возможно, dart не настолько эффективен для преобразования или понимания этого хэш-ключа. это то, что я нашел в dart:convert , /// Проверяет, что [_state] представляет допустимое декодирование. void close(строка? ввод, int? end) { if (_state < _encodePaddingState(0)) { выбросить исключение FormatException(«Отсутствует символ заполнения», ввод, конец); } if (_state > 0) { выбросить исключение FormatException( «Недопустимая длина, должна быть кратна четырем», ввод, конец); } _state = _encodePaddingState(0); }

4. Я разберусь со строкой и посмотрю, что я могу сделать с кодировкой. Еще раз спасибо за усилия. Я вернусь позже, когда найду решение для этого.