代码之家  ›  专栏  ›  技术社区  ›  iProgram

为什么bytedata.view(buffer)抛出nosuchmethoderror:class'string'没有实例方法'asbytedata'

  •  0
  • iProgram  · 技术社区  · 8 年前

    我正在尝试读取udp数据并将其转换为浮点。

    我知道我需要

    1. 从rawdatagramsocket接收数据报
    2. 从数据报中获取bytebuffer
    3. 将bytebuffer转换为bytedata
    4. 对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);
        });
      });
    }
    

    如果我使用以下命令启动netcat nc -u 192.168.1.1 4444 然后发送数据“1111”,我从调试代码中得到以下输出:

    [49, 49, 49, 49, 10]
    

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

    问题是,当我运行“坏代码”时,我最终得到以下消息:

    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)
    

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

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

    谢谢

    1 回复  |  直到 8 年前
        1
  •  2
  •   Danny Tuppeny    8 年前

    为什么当我不使用字符串或asbytedata命令时,得到的错误类“string”没有实例方法“asbytedata”?

    调用堆栈显示此处发生的情况:

    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);
    

    尽管你写了 字节缓冲区 这里,你的 getTypeName() 函数实际上返回 String :

    return reflect(obj).type.reflectedType.toString();