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

Искам да кодирам следния низ в Base64Url във Flutter и да го декодирам на сървър на Dart.

"username:password"

Как да направя това? И как да го направя в Base64?


person Suragch    schedule 18.05.2019    source източник
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 на метода fused. Така че, да, много по-лесно. - 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