如何将 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();
// ...
});
}
我已经为从 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();
// ...
});
}