在Flutter/Dart中如何进行Base64和Base64Url的编码和解码

45

我希望在Flutter中使用Base64Url对以下字符串进行编码,并在Dart服务器上解码它。

"username:password"

我该怎么做?并且我应该如何使用Base64进行操作?


2
我想要包含Base64Url,因为有时候这是必需的。虽然相关问题很有用,但它们并没有提出或回答这个问题。 - Suragch
1个回答

125

dart:convert库包含了Base64和Base64Url的编解码器。然而,它们只能对整数列表进行编解码,因此对于字符串,您还需要使用UTF-8进行编解码。您可以使用fuse将这两个编码器组合在一起,而不是分别进行两次编码。

您需要使用以下导入语句:

```dart import 'dart:convert'; ```
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

参见


1
使用Codec::fuse()方法代替utf8.decode(base64.decode(credentials));这样的结构。 - pskink
@pskink,起初我无法理解发生了什么(展开的形式更易读),但后来我意识到您不需要切换utf8base64的顺序。您只需在融合方法上使用decode即可。所以,是的,简单得多了。 - Suragch
3
这是因为fuse()方法的文档中写道:“在编码时,生成的编解码器先使用this进行编码,然后再使用other进行编码。在解码时,生成的编解码器先使用other进行解码,然后再使用this进行解码。” - pskink
1
顺便提一下,Fuse 不仅限于两个编解码器 - 您可以调用多个 Fuse 方法来链接超过两个编解码器。 - pskink
@pskink,我也发现了这个:Base64Encoder().convert(credentials.codeUnits),你还可以使用Base64Encoder.urlSafe()。你对此有什么想法?在我看来,这种方式更易读。 - Suragch
这是Base64Codec.encoder,与base64.encoder相同。 - pskink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接