How to convert a Dart Html client web socket response from Blob to Uint8List?
我已经实现了自己的二进制消息协议,用于从Dart客户端到Java服务器的简单请求/响应对象。这些在Dart中编码为Uint8List,在Java的远程服务器上编码为ByteBuffer。往返行程适用于[dart:io]中的WebSocket,因为Dart客户端命令应用程序中的websocket.listen流处理程序将传递类型为Uint8List的数据。
在[dart:html]中,从websocket.onMessage流接收到的MessageEvent.data中的响应数据键入为Blob。我找不到将Blob转换为Uint8List的方法。因为响应通常是一个大型的二进制数字数组(双精度),它将为虚拟滚动上下文提供数据,所以我想尽量减少复制。有人可以指出我正确的方向。
根据本文,您需要使用FileReader来执行此操作。
该示例似乎可以正常工作,当我在Chrome中进行测试时,结果类型为Uint8List。
1 2 3 4 5 6 7 | var blob = new Blob(['abc']); var r = new FileReader(); r.readAsArrayBuffer(blob); r.onLoadEnd.listen((e) { var data = r.result; print(data.runtimeType); }); |
另一个选项是将WebSocket.binaryType设置为" arraybuffer"。然后,MessageEvent.data将返回一个ByteBuffer,可以将其转换为Uint8List。请参见下面的示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 | import 'dart:html'; import 'dart:typed_data'; void main() { var ws = new WebSocket('...')..binaryType = 'arraybuffer'; ws.onMessage.listen((MessageEvent e) { ByteBuffer buf = e.data; var data = buf.asUint8List(); // ... }); } |