没有镜像包的flutter中如何使用ByteData和ByteBuffer
How to use ByteData and ByteBuffer in flutter without mirror package
我正在尝试开发一个接收数据并将字节转换为不同数据类型的 UDP 应用程序。
下面的代码在单独使用 Dart 时有效。
import 'dart:io';
import 'dart:typed_data';
import 'dart:mirror';
RawDatagramSocket.bind(InternetAddress.ANY_IP_V4, 20777).then((RawDatagramSocket socket){
socket.listen((RawSocketEvent e){
Datagram d = socket.receive();
if (d == null) return;
ByteBuffer buffer = d.data.buffer;
DKByteData data = new DKByteData(buffer);
exit(0);
});
});
唯一的问题是当我尝试在我的 Flutter 应用程序中 运行 它时,VS 代码在 d.data.buffer
处给我一个错误,说 The getter 'buffer' isn't defined for the class 'List<int>'.
import dart:mirror;
似乎在 flutter 中不起作用,this page 说飞镖镜像在 Flutter 中被阻止。
由于我无法导入 dart 镜像以从数据报套接字获取字节缓冲区,我还能如何做到这一点?
d.data
的类型是普通 List<int>
,而不是 Uint8List
。 List
没有 buffer
getter,所以类型系统会报错。
如果您知道该值确实是 Uint8List
或其他类型的数据,您可以在使用它之前对其进行转换:
ByteBuffer buffer = (d.data as Uint8List).buffer;
另请注意,Uint8List
不一定使用其整个缓冲区。也许做这样的事情:
Uint8List bytes = d.data;
DKByteData data = new DKByteData(bytes.buffer, bytes.offsetInBytes, bytes.lengthInBytes);
如果可能,并且如果 DKByteData
不支持,您可能希望在数据未填满缓冲区的情况下分配一个新缓冲区:
Uint8List bytes = d.data;
if (bytes.lengthInBytes != bytes.buffer.lengthInBytes) {
bytes = Uint8List.fromList(bytes);
}
DKByteData data = new DKByteData(bytes.buffer);
我正在尝试开发一个接收数据并将字节转换为不同数据类型的 UDP 应用程序。
下面的代码在单独使用 Dart 时有效。
import 'dart:io';
import 'dart:typed_data';
import 'dart:mirror';
RawDatagramSocket.bind(InternetAddress.ANY_IP_V4, 20777).then((RawDatagramSocket socket){
socket.listen((RawSocketEvent e){
Datagram d = socket.receive();
if (d == null) return;
ByteBuffer buffer = d.data.buffer;
DKByteData data = new DKByteData(buffer);
exit(0);
});
});
唯一的问题是当我尝试在我的 Flutter 应用程序中 运行 它时,VS 代码在 d.data.buffer
处给我一个错误,说 The getter 'buffer' isn't defined for the class 'List<int>'.
import dart:mirror;
似乎在 flutter 中不起作用,this page 说飞镖镜像在 Flutter 中被阻止。
由于我无法导入 dart 镜像以从数据报套接字获取字节缓冲区,我还能如何做到这一点?
d.data
的类型是普通 List<int>
,而不是 Uint8List
。 List
没有 buffer
getter,所以类型系统会报错。
如果您知道该值确实是 Uint8List
或其他类型的数据,您可以在使用它之前对其进行转换:
ByteBuffer buffer = (d.data as Uint8List).buffer;
另请注意,Uint8List
不一定使用其整个缓冲区。也许做这样的事情:
Uint8List bytes = d.data;
DKByteData data = new DKByteData(bytes.buffer, bytes.offsetInBytes, bytes.lengthInBytes);
如果可能,并且如果 DKByteData
不支持,您可能希望在数据未填满缓冲区的情况下分配一个新缓冲区:
Uint8List bytes = d.data;
if (bytes.lengthInBytes != bytes.buffer.lengthInBytes) {
bytes = Uint8List.fromList(bytes);
}
DKByteData data = new DKByteData(bytes.buffer);