如何在 Dart 中使用 GZip 或类似方法压缩字符串?

sto*_*ack 5 compression gzip dart

我想在 Dart 中压缩一个字符串(在浏览器中)。我试过这个:

import 'package:archive/archive.dart';

[...]

List<int> stringBytes = UTF8.encode(myString);
List<int> gzipBytes = new GZipEncoder().encode(stringBytes);
String compressedString = UTF8.decode(gzipBytes, allowMalformed: true);
Run Code Online (Sandbox Code Playgroud)

显然UTF8.decode不是为此而设计的,它不起作用(文件不可读)。

在 Dart 中压缩字符串的正确方法是什么?

Raf*_*zan 24

如果需要,您可以使用下面的这个功能。

import 'dart:convert';
import 'dart:io';

  void _compress(String json) {
    final enCodedJson = utf8.encode(json);
    final gZipJson = gzip.encode(enCodedJson);
    final base64Json = base64.encode(gZipJson);

    final decodeBase64Json = base64.decode(base64Json);
    final decodegZipJson = gzip.decode(decodeBase64Json);
    final originalJson = utf8.decode(decodegZipJson);
    }
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是最新的,不需要导入第三方库。 (4认同)
  • 注意:这不太可能适用于网络,因为它依赖于不支持网络的“dart:io”。 (2认同)
  • 这不应该是最好的答案,因为从 2023 年开始,Flutter Web 不支持 gzip @noobdev (2认同)

Xav*_*ier 6

压缩的字节列表可能不是有效的 UTF8 序列,您可以使用 base64 对其进行编码。

import 'dart:convert';
import 'package:archive/archive.dart';

void main() {
  var myString = 'myString';
  var stringBytes = utf8.encode(myString);
  var gzipBytes = GZipEncoder().encode(stringBytes);
  var compressedString = base64.encode(gzipBytes);

  print(compressedString);
}
Run Code Online (Sandbox Code Playgroud)

  • 我知道了。因此,如果您用于动态创建下载文件的方法*必须*处理字符串,则可以按照上述答案对数据字节进行 BASE64 编码,但请注意,它会稍微增加下载的大小。 (2认同)