Dart 新的飞镖飞镖来自现有飞镖飞镖区域?

Dart 新的飞镖飞镖来自现有飞镖飞镖区域?,dart,Dart,我正在Dart web应用程序中加载二进制文件,其中包含压缩音频数据作为二进制数据的一部分。当数据通过http请求加载时,它以ByteBuffer的形式出现,我知道这是Dart对JS ArrayBuffer的替代。decodeAudioData()方法需要一个ByteBuffer,我正试图找出如何为它提供加载的ByteBuffer的相关部分。加载的ByteBuffer包含与音频无关的附加数据。JS中的ArrayBuffers支持slice()方法,但我在ByteBuffer类中缺少此方法,并且在

我正在Dart web应用程序中加载二进制文件,其中包含压缩音频数据作为二进制数据的一部分。当数据通过http请求加载时,它以ByteBuffer的形式出现,我知道这是Dart对JS ArrayBuffer的替代。decodeAudioData()方法需要一个ByteBuffer,我正试图找出如何为它提供加载的ByteBuffer的相关部分。加载的ByteBuffer包含与音频无关的附加数据。JS中的ArrayBuffers支持slice()方法,但我在ByteBuffer类中缺少此方法,并且在转换到允许范围选择的任何列表后,我看不到任何返回ByteBuffer的方法

我想我可以用原始JS创建一个混合解决方案,但如果可能的话,我想把它保留在Dart中。感谢您的想法

在转换为之后,我找不到任何方法回到ByteBuffer 允许范围选择的任何列表

有几种方法可以解决这个问题,但由于您不想修改原始缓冲区(我猜),因此您将复制几个字节:

// extract 2 ints (8 bytes) - no copying done yet
var rangeIterable = buffer.asInt32List().getRange(8, 10);

// create new typed list (copies the bytes from the iterable)
var newList = new Int32List.fromList(rangeIterable);
var newBuffer = newList.buffer;

print(buffer.lengthInBytes);
print(newBuffer.lengthInBytes);

Dart
ByteBuffer
没有切片方法。您可以深入查看
Uint8List
,因此您可以使用
buffer.asUint8List().sublist(a,b).buffer来代替
buffer.slice(a,b)
。类型化数据列表上的
子列表
方法返回由新缓冲区支持的相同类型的列表,而
缓冲区
getter返回任何类型化数据列表的基础缓冲区。
它不像直接放在缓冲区上的
切片
那么漂亮,但它完成工作时没有任何对齐问题(
Int32List
要求其起始偏移量为4字节对齐,因此对于任意剪切,始终使用8位列表)。

非常感谢!我认为还有一个小小的补充,就是应该在RangeTable上调用toList()来处理Int32List.fromList()。我甚至没有想到在创建新的Int32List时会填充buffer属性。我已经习惯了它只是对原始数据的引用,但它代表复制的数据当然是有意义的。您真的需要添加
.toList()
?因为当我在本地试用它时,它就是这样工作的(就是说没有强模式)。我相信是这样的。当我在没有它的情况下尝试时,它给了我一个类型转换错误。“类型'SubListEnable'不是'elements'类型'List'的子类型”注意,我正在用Dartium进行测试,它是从Intellij启动的,我认为默认情况下可能启用Checked模式-可以吗?很有可能-我在控制台应用程序中试用过:)谢谢!这是一个简洁的方法,也是选择1字节列表类型的一个好方法。它在哪里说
子列表
有一个新的缓冲区支持?我能在中找到的只是它返回“一个新列表”。我在DartPad中尝试了它,它似乎很有效,但我担心这是一个实现细节。