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

Posted

技术标签:

【中文标题】Dart - 相当于 Dart 的 C# Stream/MemoryStream 和 stream.WriteByte(..)【英文标题】:Dart - Whats equivalent of C# Stream/MemoryStream and stream.WriteByte(..) for Dart 【发布时间】:2020-01-29 07:16:23 【问题描述】:

需要在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> 更有效。虽然我可以在Uint8Listadd int8Uint8List 只能用固定长度初始化。我需要一些动态的东西,我可以说writeadd 而无需添加任何索引。不知道add()Uint8List 是如何工作的。在 Internet 或文档中找不到太多内容。

【问题讨论】:

【参考方案1】:

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

您可以:

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

【讨论】:

有什么类似于Outputstream或者stream的东西可以边写边写数据吗? @Rohit 我不知道Outputstream 是什么。如果您正在寻找可以进行有效连接的东西(例如 C++ 的std::stringstream),我认为与 Dart SDK 最接近的等价物是StringBuffer。有一个第三方buffer package 对字节数据做同样的事情。 “缓冲包”看起来很有希望,会试一试。可能是我要找的东西!谢谢 我忘了注意我从未使用过也不能保证buffer 包;这只是我在 pub.dev 上搜索“buffer”时的第一个结果。 @Rohit 好的,完成。 (我提到的其他方法也可以完全按照您在代码示例中提到的那样做。;))【参考方案2】:

Uint8Buffer 类似于 MemoryStream

add() 类似于WriteByte(),您可以将Uint8List 传递给addAll(),所以它类似于Write()

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

这些列表就像一个类型化数据列表一样工作,除了它们是 可生长的。他们使用底层缓冲区,当该缓冲区变为 太小,用新的缓冲区代替。

【讨论】:

【参考方案3】:

使用来自dart:io 的BytesBuilder。

【讨论】:

以上是关于Dart - 相当于 Dart 的 C# Stream/MemoryStream 和 stream.WriteByte(..)的主要内容,如果未能解决你的问题,请参考以下文章

Dart 有像 c# 这样的扩展方法吗?

Dart语言学习(十三) Dart Mixins 实现多继承

Dart 2 中的 const 何时是可选的?

在 Dart (Flutter) 中将日期时间转换为 C# timetick [关闭]

如何在 Dart 中编码 URL?

Dart - 循环导入