Dart 知识集锦 | Base64 编解码


theme: cyanosis

1. Dart 中的 Base64 编解码

在编程的世界中,数据的种类可谓是缤纷多彩。但是他们有本质的共性: 都是二进制的数据。在数据传输过程中,字节数组有时并不是很方便,比如网络传输。
Base64 包括小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"一共64个字符的字符集。它可以将 字节数组 进行编码进行传输。Dart 语言的 convert 包中,有 Base64Codec 支持 Base64 编解码,下面一起来看一下其使用方式:

image.png


Base64 编码

Base64 编码是将 字节数组 转化为字符串的一种方式,如下是 Base64Encoder 的 convert 方法:

image.png


Base64 解码

Base64 的字符串是不可读的,但可以对 Base64 字符串进行解码,获取其原本的 字节数组 。如下是 Base64Decoder 的 convert 方法:

image.png


2. Base64 编码使用方式

字符串、图片、视频、音频、文件... 任何数据本质上都可以是字节数组。所以任何数据都可以进行 Base64 编码,下面先看一下对字符串的编码:

  • 字符串编码

Base64 编码的入参是字符列表,需要将文本通过 utf8 进行编码,得到 Unit8List ,然后将其作为入参进行转换。 张风捷特烈 对应的 Base64 编码为 5byg6aOO5o2354m554OI

```dart import 'dart:convert';

void main() async { String data = '张风捷特烈'; String ret = base64.encode(utf8.encode(data)); print(ret); // 5byg6aOO5o2354m554OI

} ```

  • 图片/文件编码

任何文件都是字节数组,所以一张图片也有其对应的 Base64 编码,如下所示,读取一张图片的字节数组,将其通过 base64 进行编码,可以得到一个字符串:

```dart import 'dart:convert'; import 'dart:io'; import 'dart:typed_data';

void main() async { String file = r'D:\Files\photo\bg\src\out.png'; String ret = await base64File(file); print(ret); }

Future base64File(String path) async { Uint8List list = await File(path).readAsBytes(); return base64.encode(list); } ```

通过对这个字符串的解析,可以获取图片对应的原始数据,从而展示图片。这样对于一些小图片,通过 Base64 编码就可以很轻松的进行数据传输,而不是通过网络请求图片或读取资源:

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

image.png


3. Base64 解码使用方式

Base64 解码 是将编码后的字符串还原为原始字符串。如下所示,通过 base64.decode'5byg6aOO5o2354m554OI'解码得到字节数组,然后将字节数组通过 utf8 编码为字符串。当然,你也可以直接将字节数组写入文件:

```dart import 'dart:convert'; import 'dart:typed_data';

void main() async { String data = '5byg6aOO5o2354m554OI'; Uint8List bytes = base64.decode(data); print(utf8.decode(bytes)); //张风捷特烈 } ```


Flutter 中的 Image 组件有一个 memory 构造,可以接收字节数组作为图片数据源。刚好 base64 解码可以生成一个 Uint8List 对象:

image.png

下面代码,可以让 Flutter 的 Image 组件展示 Base64 编码的图片。如果 base64 非常大,可以考虑将解析逻辑放在 isolate 里解析,解析过程中展示 loading 示意:

```dart final String baseImage = """base字符串"""; late Uint8List imageBytes;

@override void initState() { super.initState(); /// 解析数据 imageBytes = base64.decode(baseImage);

}

/// 视图展示 Image.memory(imageBytes) ```


本文主要介绍了 Dart 的 Base64 编解码能力,大家也可以尝试一下,通过 Flutter 提供交互界面,来打造 Base64 编解码的小工具。匠心千刃(Blade) 正在尝试基于 tolyui 打造一个全平台的通用工具集。

image.png

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值