gpt4 book ai didi

dart - 为什么 '_Uint8ArrayView' 可能会返回到 Dart 命令行客户端的 websocket onData 处理程序?

转载 作者:行者123 更新时间:2023-12-03 04:30:43 28 4
gpt4 key购买 nike

我有一个命令行 Dart 脚本客户端通过 [dart:io] websocket 与 Jetty 服务器进行交互。我已经实现了一个自定义消息子协议(protocol),它使用反射(双方)使用二进制编码在 Jetty 中将 Dart 对象与 Java 对象交换。 PODO -> Uint8List -> 电线 -> ByteBufer -> POJO(反之亦然)。本地往返单元测试在任一侧正确执行(即 PODO -> Uint8List -> PODO;POJO -> ByteBuffer -> POJO)。我已经使用一系列简单的“字符串”交换测试了与不同服务端点的连接。从 Dart 到 Jetty 的传输有效,但响应数据虽然正确接收,但会产生我不理解的奇怪类型,解码器也不理解为 Uint8List、ByteBuffer 等。

虽然我不能轻易地将其提炼成一个小例子,但这里是相关代码和一些输出:

Dart 客户:

WebSocket.connect(url).then((WebSocket socket) {
_log.finer('connected');
_websocket = socket
..listen(_onResponse, onError: (e, StackTrace st) => print('Session error: $e; $st'));
...
}

_onResponse(data) {
print('response raw data: $data');
InstanceMirror im = reflect(data);
print('instance: $im');
...
decode(data)
}

decode(Uint8List data) {
var b = data.buffer;
ByteData bd = new ByteData.view(b);
int offset = 0;
const ENDIANNESS = Endianness.LITTLE_ENDIAN;

int msgLength = bd.getInt32(offset, ENDIANNESS); // is 6645122; should be 101
...
}

输出:

    response raw data: [101, 0, 0, 0, ...]
instance: InstanceMirror on Instance of '_Uint8ArrayView'

IntelliJ 调试器显示:

    data = {List[id=1]} size = 101
> im = {_LocalInstanceMirror[id=2]} InstanceMirror on Instance of '_Uint8ArrayView'
_reflectee = {List[id=1]}
_type = null
hasReflectee = true

最佳答案

Dart 支持通用 ByteBuffer类型,它只代表一个字节列表,如您在此处看到的:

https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:typed_data.ByteBuffer

因为 ByteBuffer 类是 摘要 ,您可以通过接收 ByteBuffer 对象或通过实例化新列表来创建列表。该列表通常是固定长度的,使用它很困难。这就是为什么您可以创建 浏览量 来自 ByteBuffer。 View 表示 ByteBuffers 字节的子集,由 offset 给出和 length这也可能是整个缓冲区。

让我们看一个小例子:

import 'dart:typed_data';

void main() {
Uint8List data8 = new Uint8List.fromList([1,2,3,4,5,6,256]);
Uint16List data16 = new Uint16List.fromList([1,2,3,4,5,6,256]);

print(data8);
print(data16);

print(data8.buffer.lengthInBytes);
print(data16.buffer.lengthInBytes);

print(data16.buffer.asUint8List());
print(data16.buffer.asUint16List());
}

这给了你:

[1, 2, 3, 4, 5, 6, 0] // List
[1, 2, 3, 4, 5, 6, 256] // List
7
14
[1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 0, 1] // View
[1, 2, 3, 4, 5, 6, 256] // View

这意味着:ByteBuffer 是一些抽象类,它为您提供接口(interface)和基本功能,您可以从缓冲区获取 View 以根据需要访问数据。

关于dart - 为什么 '_Uint8ArrayView' 可能会返回到 Dart 命令行客户端的 websocket onData 处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27674032/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com