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>
更有效。虽然我可以在Uint8List
中add
int8
但Uint8List
只能用固定长度初始化。我需要一些动态的东西,我可以说write
或add
而无需添加任何索引。不知道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语言学习(十三) Dart Mixins 实现多继承