casting - 为什么ByteData.view(buffer)抛出NoSuchMethodError:类 'String'没有实例方法 'asByteData'

标签 casting dart udp buffer

我正在尝试读取UDP数据并将其转换为float。

我知道我需要

  • 从RawDatagramSocket接收数据报
  • 从数据报
  • 中获取ByteBuffer
  • 将ByteBuffer转换为ByteData
  • 在ByteData上使用getFloat32方法

  • 这是损坏的代码:
    import 'dart:io';
    import 'dart:typed_data';
    import 'dart:mirrors';
    
    getTypeName(dynamic obj) {
      return reflect(obj).type.reflectedType.toString();
    }
    
    void main(List<String> args){
      RawDatagramSocket.bind("192.168.1.1", 4444).then((RawDatagramSocket socket){
        print('Datagram socket ready to receive');
        print('${socket.address.address}:${socket.port}');
        socket.listen((RawSocketEvent e){
          Datagram d = socket.receive();
          if (d == null) return;
          ByteBuffer buffer = getTypeName(d.data.buffer);
          ByteData bdata = new ByteData.view(buffer);
        });
      });
    }
    

    这是调试代码:
    import 'dart:io';
    import 'dart:typed_data';
    import 'dart:mirrors';
    
    getTypeName(dynamic obj) {
      return reflect(obj).type.reflectedType.toString();
    }
    
    void main(List<String> args){
      RawDatagramSocket.bind("192.168.1.1", 4444).then((RawDatagramSocket socket){
        print('Datagram socket ready to receive');
        print('${socket.address.address}:${socket.port}');
        socket.listen((RawSocketEvent e){
          Datagram d = socket.receive();
          if (d == null) return;
          print(d.data);
        });
      });
    }
    

    如果我使用以下命令nc -u 192.168.1.1 4444初始化netcat并发送数据“1111”,则会从调试代码中打印出以下内容:
    [49, 49, 49, 49, 10]
    

    我知道这些值是assai字符“1111”,后跟回车符。

    问题是,当我运行“代码破损”时,最终收到以下消息:
    Unhandled exception:
    NoSuchMethodError: Class 'String' has no instance method 'asByteData'.
    Receiver: "_ByteBuffer"
    Tried calling: asByteData(0, null)
    #0      Object._noSuchMethod (dart:core-patch/object_patch.dart:43)
    #1      Object.noSuchMethod (dart:core-patch/object_patch.dart:47)
    #2      new ByteData.view (dart:typed_data:449)
    #3      main.<anonymous closure>.<anonymous closure> (file:///Users/iProgram/test.dart:17:25)
    #4      _RootZone.runUnaryGuarded (dart:async/zone.dart:1307)
    #5      _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:330)
    #6      _BufferingStreamSubscription._add (dart:async/stream_impl.dart:257)
    #7      _StreamController&&_SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:796)
    #8      _StreamController._add (dart:async/stream_controller.dart:667)
    #9      _StreamController.add (dart:async/stream_controller.dart:613)
    #10     new _RawDatagramSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1699)
    #11     _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:760)
    #12     _microtaskLoop (dart:async/schedule_microtask.dart:41)
    #13     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50)
    #14     _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:99)
    #15     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:152)
    

    问题是,当我不使用字符串或asByteData命令时为什么会出现错误Class 'String' has no instance method 'asByteData'

    我一直在使用以下文档:Dart - ByteData

    谢谢

    最佳答案

    why am I getting the error Class 'String' has no instance method 'asByteData' when I am not using a string or the asByteData command?



    调用堆栈显示了这里发生的事情:
    Tried calling: asByteData(0, null)
    #0      Object._noSuchMethod (dart:core-patch/object_patch.dart:43)
    #1      Object.noSuchMethod (dart:core-patch/object_patch.dart:47)
    #2      new ByteData.view (dart:typed_data:449)
    

    您正在调用new ByteData.view,而在内部调用asByteData
    ByteData.view构造函数采用ByteBuffer,但您正在将其传递给字符串:
    ByteBuffer buffer = getTypeName(d.data.buffer);
    

    尽管您在此处编写了ByteBuffer,但是getTypeName()函数实际上返回的是String:
    return reflect(obj).type.reflectedType.toString();
    

    关于casting - 为什么ByteData.view(buffer)抛出NoSuchMethodError:类 'String'没有实例方法 'asByteData',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50898689/

    相关文章:

    c - 将 int 类型转换为 char,然后搜索数组

    c - "(type)variable"和 "*((type *)&variable)"之间有什么区别(如果有)?

    flutter - 如何在 Flutter 中获取小部件内的主题颜色

    flutter - 错误 : The argument type 'MaterialPageRoute' can't be assigned to the parameter type 'Route<Map>'

    c++ - UDP 绑定(bind) : Address already in use

    java - 将接收数据包与字符串 UDP 协议(protocol)进行比较

    swift - Swift 中的向上转换和向下转换混淆?

    c# - 将 Combobox.SelectedItem 转换回 DateTime 会导致 "Specified cast is not valid."

    flutter - 行中小部件的动态高度波动

    c - 带有 gcc 编译器的 UDP recvfrom 警告