Как кодировать и декодировать Base64 и Base64Url во Flutter / Dart

Я хочу закодировать следующую строку в Base64Url во Flutter и декодировать ее на сервере Dart.

"username:password"

Как мне это сделать? А как мне это сделать в Base64?


person Suragch    schedule 18.05.2019    source источник
comment
comment
Также связанный Как преобразовать строку в собственном коде - ›base64 и base64 -› строка   -  person Herohtar    schedule 18.05.2019
comment
Я хотел бы включить Base64Url, поскольку иногда это необходимо. Связанные вопросы, хотя и полезны, не задают и не отвечают.   -  person Suragch    schedule 19.05.2019


Ответы (1)


Библиотека dart:convert содержит кодировщик и декодер для Base64 и Base64Url. Однако они кодируют и декодируют списки целых чисел, поэтому для строк вам также необходимо кодировать и декодировать в UTF-8. Вместо того, чтобы выполнять эти две кодировки по отдельности, вы можете объединить их с помощью fuse.

У вас должен быть следующий импорт:

import 'dart:convert';

Base64

String credentials = "username:password";
Codec<String, String> stringToBase64 = utf8.fuse(base64);
String encoded = stringToBase64.encode(credentials);      // dXNlcm5hbWU6cGFzc3dvcmQ=
String decoded = stringToBase64.decode(encoded);          // username:password

Обратите внимание, что это эквивалентно:

String encoded = base64.encode(utf8.encode(credentials)); // dXNlcm5hbWU6cGFzc3dvcmQ=
String decoded = utf8.decode(base64.decode(encoded));     // username:password

Base64Url

String credentials = "username:password";
Codec<String, String> stringToBase64Url = utf8.fuse(base64Url);
String encoded = stringToBase64Url.encode(credentials);      // dXNlcm5hbWU6cGFzc3dvcmQ=
String decoded = stringToBase64Url.decode(encoded);          // username:password

Опять же, это эквивалентно:

String encoded = base64Url.encode(utf8.encode(credentials)); // dXNlcm5hbWU6cGFzc3dvcmQ=
String decoded = utf8.decode(base64Url.decode(encoded));     // username:password

Смотрите также

person Suragch    schedule 18.05.2019
comment
вместо конструкций типа utf8.decode(base64.decode(credentials)); используйте Codec::fuse() метод - person pskink; 18.05.2019
comment
намного проще, не правда ли? - person pskink; 18.05.2019
comment
@pskink, Сначала я не мог осмыслить происходящее (развернутая форма казалась более читаемой), но потом я понял, что менять порядок utf8 и base64 не нужно. Вы просто используете decode в объединенном методе. Так что да, намного проще. - person Suragch; 18.05.2019
comment
это потому, что в документации метода fuse() говорится: При кодировании результирующий кодек кодируется с помощью this перед кодированием с помощью other. При декодировании результирующий кодек декодируется с помощью other перед декодированием с помощью this. - person pskink; 18.05.2019
comment
btw fuse не ограничивается двумя кодеками - вы можете вызвать несколько методов fuse, чтобы связать более двух кодеков - person pskink; 18.05.2019
comment
@pskink Я также нашел это: Base64Encoder().convert(credentials.codeUnits), где вы также можете сделать Base64Encoder.urlSafe(). Что вы думаете об этом? Мне это кажется более читаемым. - person Suragch; 19.05.2019
comment
это Base64Codec.encoder - то же, что base64.encoder - person pskink; 19.05.2019