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

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

В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
2
0
65
1

Ответы 1

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

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

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

Итак, RU5UUkVHQUdSQVRJU1 == не соответствует шаблону кодировки.

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

JosefZ 02.04.2021 13:43

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

Gabriel Kojima 03.04.2021 05:11

@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); }

Ayyaz.meo 05.04.2021 11:09

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

Gabriel Kojima 05.04.2021 21:13

Другие вопросы по теме