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

How to convert a Dart Html client web socket response from Blob to Uint8List?

我已经为从 Dart 客户端到 Java 服务器的简单 request/response 对象实现了我自己的二进制消息协议。它们在 Dart 中编码为 Uint8List,在远程服务器上编码为 Java 中的 ByteBuffer。往返适用于 [dart:io] 中的 WebSocket,因为 Dart 客户端命令应用程序中的 websocket.listen 流处理程序传递的数据类型为 Uint8List。

在 [dart:html] 中,从 websocket.onMessage 流接收到的 MessageEvent.data 中的响应数据类型为 Blob。我没有找到将 Blob 转换为 Uint8List 的方法。因为响应通常是一个大型二进制数字数组 (double),它将向虚拟滚动上下文提供数据,所以我想尽量减少复制。有人能给我指出正确的方向吗?

根据此article,您需要使用 FileReader 来执行此操作。

这个例子似乎可行,当我在 Chrome.

中测试时,结果类型是一个 Uint8List
  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 将 return 一个可以变成 Uint8List 的 ByteBuffer。请参阅下面的示例。

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