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

时间:2015-02-28 03:18:21

标签: dart

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

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

1 个答案:

答案 0 :(得分:4)

根据此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将返回一个ByteBuffer,它可以转换为Uint8List。请参阅下面的示例。

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