如何将Dart Html客户端Web套接字响应从Blob转换为Uint8List?

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();
    // ...
  });
}