简体   繁体   English

如何将 UDP 数据报解析为 Dart Class

[英]How to parse UDP datagram to a Dart Class

I am developing a Dart application.我正在开发一个 Dart 应用程序。 This app receives UDP packages from a socket.此应用程序从套接字接收 UDP 包。 Here is an example of a datagram struct(sent from a C application):这是数据报结构的示例(从 C 应用程序发送):

struct DataLoggerMessage
{
   uint16_t loggerFlag;
   uint16_t eventOnOff;
   uint16_t generatedEventNumber;
   uint16_t systemPausedFlag;
   mainInput input;
   mainOutput output;
};

struct mainInput{
   float p1;
   int p2;
   double p3;
   ....
}

struct mainOutput{
   float p1;
   int p2;
   double p3;
   ....
}

I want to parse these comming struct to a Dart class like below:我想将这些通信结构解析为 Dart class ,如下所示:

class DataLoggerMessage {
   int? loggerFlag;
   int? eventOnOff;
   int? generatedEventNumber;
   int? systemPausedFlag;
   MainInput? mainInput;
   MainOutput? mainOutput;
}

My main problem is to determine right bytes.我的主要问题是确定正确的字节。 For example;例如; first 2 bytes of the datagram is 'loggerFlag', but in the dart class 'loggerFlag' is 4 byte integer.数据报的前 2 个字节是“loggerFlag”,但在 dart class 中,“loggerFlag”是 4 个字节 integer。 Of course I can store 2 byte in an int.当然,我可以在一个 int 中存储 2 个字节。 But I need a proper parser for whole struct.但是我需要一个适合整个结构的解析器。 For example in C we can simply do this:例如在 C 我们可以简单地这样做:

memcpy(ioStruct, value,  sizeof(DataLoggerMessage));

Is there a method in dart like above? dart 中是否有类似上面的方法? Thanks.谢谢。

Assuming you get a ByteBuffer , you can simply have:假设你得到一个ByteBuffer ,你可以简单地拥有:

var short_int_list = byte_buffer.asInt!6List(0, 4)
data_logger_message.loggerFlag = short_int_list[0]
data_logger_message.eventOnOff = short_int_list[1]
...

similarly for a ByteData object, then you have things like同样对于ByteData object,那么你有类似的东西

var byte_length = 2
data_logger_message.loggerFlag = byte_data.getInt16(0*byte_length)
data_logger_message.eventOnOff = byte_data.getInt16(1*byte_length)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM