【问题标题】:How to use ByteData and ByteBuffer in flutter without mirror packageflutter 中如何在没有镜像包的情况下使用 ByteData 和 ByteBuffer
【发布时间】:2018-08-11 15:13:53
【问题描述】:

我正在尝试开发一个 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 镜像以从数据报套接字获取 Bytebuffer,我还能如何做到这一点?

【问题讨论】:

    标签: dart udp flutter


    【解决方案1】:

    d.data 的类型是普通的List<int>,而不是Uint8ListList 没有 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);
    

    【讨论】:

    • 如果我要做DKByteData data = DKByteData(Uint8List.fromList(d.data).buffer);,这是否能保证我得到所有字节,因为我只是跳过你的检查并立即获得 UInt8List.fromList?这是我在你发帖之前发现的。你有比我发现的更有用的信息。我刚刚发现“如何”。你已经告诉了我“为什么”和一些警告。
    • 是的,这总是会让你得到原始列表的所有字节。它会将字节复制到一个新的缓冲区,即使原始缓冲区已经足够了,所以你会得到额外的开销。
    猜你喜欢
    • 2014-06-04
    • 1970-01-01
    • 2021-04-12
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2020-05-10
    相关资源
    最近更新 更多