Dart - 什么相当于 C# Stream/MemoryStream 和 stream.WriteByte(..) for Dart

Dart - Whats equivalent of C# Stream/MemoryStream and stream.WriteByte(..) for Dart

需要在dart

中实现以下
MemoryStream stream = new MemoryStream(288);
stream.WriteByte((byte) 13);
stream.WriteByte((byte) 12);
stream.WriteByte((byte) 10);
stream.WriteByte((byte) 8);
stream.WriteByte((byte) 6);
stream.WriteByte((byte) 9);
var result = stream.ToArray();

我来自 C#/java 背景并尝试使用 Uint8List,它等同于 byte[],并且比 List<int> 更有效。虽然我可以 add int8 in Uint8List 但是 Uint8List 只能用固定长度初始化。我需要一些动态的东西,我可以只说 writeadd 而不需要添加任何索引。不知道 Uint8Listadd() 是如何工作的。在 Internet 或文档中找不到太多信息。

我不相信有标准的等价物。 (有a GitHub comment explaining why Uint8List requires a fixed length。)

您可以:

  • 使用 List<int> 然后转换为 Uint8List
  • 创建您自己的 class 包装 Uint8List。当需要额外的容量时,您需要分配一个新的 Uint8List ,比方说,它的大小是以前的两倍,并复制旧元素。 (这是大多数其他可增长列表实现(例如 C++ 的 std::vector)所做的。)可能 pub.dev 上已经有一些现有的 Dart 包已经这样做了。
  • 创建一个包含 List<Uint8List> 的 class,根据需要添加新的 Uint8List 成员,并在完成后将它们连接成一个 Uint8List。有第三方buffer package可以做到这一点,但我从未亲自使用过,不能保证。

Uint8Buffer 类似于 MemoryStream

add() 就像 WriteByte(),你可以将 Uint8List 传递给 addAll() 所以它就像 Write()

备注https://api.flutter.dev/flutter/typed_data.typed_buffers/typed_data.typed_buffers-library.html

These lists works just as a typed-data list, except that they are growable. They use an underlying buffer, and when that buffer becomes too small, it is replaced by a new buffer.

使用 dart:io 中的 BytesBuilder