【问题标题】:How to read byte array data in Dart?如何在 Dart 中读取字节数组数据?
【发布时间】:2018-09-06 08:56:27
【问题描述】:

连接 TCP Socket 服务器并发送请求。并且服务器也在字节数组中发送响应。 dart中如何读取字节数组数据。

Socket.connect('localhost', 8081)
  .then((socket) {
//Establish the onData, and onDone callbacks
socket.listen((data) {
  print(new String.fromCharCodes(data).trim()); //Here data is byte[]
  //How to read byte array data

},
    onDone: () {
      print("Done");
      // socket.destroy();

    },
    onError: (e) {
      print('Server error: $e');
    });
 socket.add([255, 12, 0, 11, 0, 9, 34, 82, 69, 70, 84, 65, 72, 73, 76]);
 });
}

【问题讨论】:

  • 你能扩展你想做的事吗? listen 调用可以说是读取字节数据,它接收字节数据作为这里的data 参数,你在第一行使用它。 dataList<int>,可以这样使用。
  • 列表 fileBytes = data.toList();打印(文件字节);打印以下字节数组数据如何读取此数据或如何获得正确的有意义的消息 [255,20,0,11,0,0,0,15,80,82,69,77,84,65,72,73 ,76,45,53,53,57,55,48]

标签: dart flutter


【解决方案1】:

这取决于数据类型被编码为字节。假设它是String 然后你可以用dart:convert library 来做。

import 'dart:convert' show utf8;

final decoded = utf8.decode(data);

【讨论】:

    【解决方案2】:

    很明显,这些字节中有一个消息结构。您举了两个消息示例:

    [255, 12, 0, 11, 0, 9, 34, 82, 69, 70, 84, 65, 72, 73, 76]

    [255, 20, 0, 11, 0, 0, 0, 15, 80, 82, 69, 77, 84, 65, 72, 73, 76, 45, 53, 53, 57, 55, 48]

    两者都以 255 开头,然后是两个或三个 little endian 16 位字(12 和 11)和(20、11 和 0),后跟一个字符串,其长度以前导字节编码。如果您希望与另一个系统进行互操作,那么您确实需要协议规范。

    假设我猜对了结构,这段代码

    main() {
      Uint8List input = Uint8List.fromList([
        255,
        20,
        0,
        11,
        0,
        0,
        0,
        15,
        80,
        82,
        69,
        77,
        84,
        65,
        72,
        73,
        76,
        45,
        53,
        53,
        57,
        55,
        48
      ]);
    
      ByteData bd = input.buffer.asByteData();
      print(bd.getUint16(1, Endian.little)); // print the first short
      print(bd.getUint16(3, Endian.little)); // and the second
      print(bd.getUint16(5, Endian.little)); // and the third
      int stringLength = input[7]; // get the length of the string
      print(utf8.decode(input.sublist(8, 8 + stringLength))); // decode the string
    }
    

    生产

    20
    11
    0
    PREMTAHIL-55970
    

    如预期的那样

    【讨论】:

      猜你喜欢
      • 2015-05-18
      • 2019-12-09
      • 2011-10-07
      • 2017-07-03
      • 1970-01-01
      • 2015-06-04
      • 2016-06-22
      • 1970-01-01
      相关资源
      最近更新 更多