Как я могу обрабатывать необработанные байты на дротике? - PullRequest
0 голосов
/ 03 августа 2020

Я совершенно новичок в разработке приложений.

Я пытаюсь связаться с C -записанным конечным устройством через необработанный пакет UDP. (такой протокол, подобный протоколу Modbus) И я страдаю от проблем с последовательным / десериализуемым классом (структура).

Вот простой класс Packet, который содержит uint32, uint16, uint8.

  1. Pack() работает, но есть ли лучший способ добиться этого?
  2. Я не знаю, как реализовать метод Unpack(). Я имею в виду, как я могу преобразовать Uint8List в int?
import 'dart:typed_data';

void main() {
  var pkt = new Packet();
  pkt.TID = 0x01234567;
  pkt.Src = 0x89;
  pkt.Des = 0xab;
  pkt.Data = 0xcdef;
  var buf = pkt.Pack();

  print('Packed: ${buf}');

  var pkt_2 = new Packet();
  if (pkt_2.Unpack(buf) != null) {
    print("panic!");
    return;
  }
  print('UnPacked: ${pkt_2.toString()}');
}

class Packet {
  int TID; // uint32
  int Src; // uint8
  int Des; // uint8
  int Data; //  uint16

  static const SIZE = 8;

  String toString() {
    return 'TID: ${TID.toRadixString(16)}, Src:${Src.toRadixString(16)}, Des:${Des.toRadixString(16)}, Data:${Data.toRadixString(16)}';
  }

  Uint8List Pack() {
    var buf = Byteconv.itou32(TID) +
        Byteconv.itou8(Src) +
        Byteconv.itou8(Des) +
        Byteconv.itou16(Data);

    return Uint8List.fromList(buf);
  }

  Error Unpack(Uint8List buf) {
    if (buf.length != SIZE) {
      return Error();
    }

    // What can I do?
    // TID =
    // Src =
    // Des =
    // Data =

    return null;
  }
}

class Byteconv {
  static Uint8List itou64(int val) {
    return Uint8List(8)..buffer.asByteData().setUint64(0, val, Endian.big);
  }

  static Uint8List itou32(int val) {
    return Uint8List(4)..buffer.asByteData().setUint32(0, val, Endian.big);
  }

  static Uint8List itou16(int val) {
    return Uint8List(2)..buffer.asByteData().setUint16(0, val, Endian.big);
  }

  static Uint8List itou8(int u8) {
    return Uint8List(1)..buffer.asUint8List()[0] = u8;
  }
}

РЕШЕНО

    var buf_view = ByteData.sublistView(buf);
    TID = buf_view.getUint32(0);
    Src = buf_view.getUint8(4);
    Des = buf_view.getUint8(5);
    Data = buf_view.getUint16(6);
...