public int Serialize(ref byte[] bytes, int offset, JT808_0x0001 value, IJT808FormatterResolver formatterResolver) { offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.MsgNum); offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, (ushort)value.MsgId); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.JT808TerminalResult); return(offset); }
public static byte[] Serialize(JT808Package jT808Package, IJT808FormatterResolver resolver) { if (resolver == null) { resolver = DefaultResolver; } var formatter = resolver.GetFormatter <JT808Package>(); // ref https://www.cnblogs.com/TianFang/p/9193881.html var pool = ArrayPool <byte> .Shared; byte[] buffer = pool.Rent(65536); try { var len = formatter.Serialize(ref buffer, 0, jT808Package, DefaultResolver); return(buffer.AsSpan().Slice(0, len).ToArray()); } catch (JT808Exception ex) { throw new JT808Exception("Serialize", ex); } catch (Exception ex) { throw new Exception("Serialize", ex); } finally { pool.Return(buffer, true); } }
public int Serialize(ref byte[] bytes, int offset, JT808_0x0200 value, IJT808FormatterResolver formatterResolver) { offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.AlarmFlag); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.StatusFlag); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.Lat); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.Lng); offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.Altitude); offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.Speed); offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.Direction); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.GPSTime); if (value.JT808LocationAttachData != null && value.JT808LocationAttachData.Count > 0) { foreach (var item in value.JT808LocationAttachData) { try { object attachImplObj = formatterResolver.GetFormatterDynamic(item.Value.GetType()); offset = JT808FormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref bytes, offset, item.Value, formatterResolver); } catch (Exception ex) { } } } return(offset); }
public JT808_0x0704 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { offset = 0; JT808_0x0704 jT808_0X0704 = new JT808_0x0704(); jT808_0X0704.Count = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset); jT808_0X0704.LocationType = (JT808_0x0704.BatchLocationType)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset); List <JT808_0x0200> jT808_0X0200s = new List <JT808_0x0200>(); int bufReadSize; for (int i = 0; i < jT808_0X0704.Count; i++) { int buflen = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset); //offset = offset + 2; try { JT808_0x0200 jT808_0X0200 = formatterResolver.GetFormatter <JT808_0x0200>().Deserialize(bytes.Slice(offset, buflen), offset, formatterResolver, out bufReadSize); jT808_0X0200s.Add(jT808_0X0200); } catch (Exception ex) { } offset = offset + buflen; } jT808_0X0704.Positions = jT808_0X0200s; readSize = offset; return(jT808_0X0704); }
public JT808Package Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { JT808Package jT808Package = new JT808Package(); // 转义还原——>验证校验码——>解析消息 // 1. 解码(转义还原) ReadOnlySpan <byte> buffer = JT808DeEscape(bytes, 0, bytes.Length); // 2. 验证校验码 // 2.1. 获取校验位索引 int checkIndex = buffer.Length - 2; // 2.2. 获取校验码 jT808Package.CheckCode = buffer[checkIndex]; // 2.3. 从消息头到校验码前一个字节 byte checkCode = buffer.ToXor(1, checkIndex); // 2.4. 验证校验码 if (jT808Package.CheckCode != checkCode) { throw new JT808Exception($"{jT808Package.CheckCode}!={checkCode}"); } jT808Package.Begin = buffer[offset]; offset = offset + 1; // 3.初始化消息头 try { jT808Package.Header = formatterResolver.GetFormatter <JT808Header>().Deserialize(buffer, offset, formatterResolver, out readSize); } catch (Exception ex) { throw new JT808Exception($"消息头解析错误,offset:{offset.ToString()}", ex); } offset = readSize; if (jT808Package.Header.MessageBodyProperty.DataLength != 0) { JT808BodiesTypeAttribute jT808BodiesTypeAttribute = jT808Package.Header.MsgId.GetAttribute <JT808BodiesTypeAttribute>(); if (jT808BodiesTypeAttribute != null) { if (jT808Package.Header.MessageBodyProperty.IsPackge) {//4.分包消息体 从17位开始 或 未分包消息体 从13位开始 //消息总包数2位+包序号2位=4位 offset = offset + 2 + 2; } if (jT808Package.Header.MessageBodyProperty.DataLength != 0) { try { //5.处理消息体 jT808Package.Bodies = JT808FormatterResolverExtensions.JT808DynamicDeserialize(formatterResolver.GetFormatterDynamic(jT808BodiesTypeAttribute.JT808BodiesType), buffer.Slice(offset, jT808Package.Header.MessageBodyProperty.DataLength).ToArray(), offset, formatterResolver, out readSize); } catch (Exception ex) { throw new JT808Exception($"消息体解析错误,offset:{offset.ToString()}", ex); } } } } jT808Package.End = buffer[bytes.Length - 1]; readSize = buffer.Length; return(jT808Package); }
public int Serialize(ref byte[] bytes, int offset, JT808_0x0900 value, IJT808FormatterResolver formatterResolver) { offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.PassthroughType); object obj = formatterResolver.GetFormatterDynamic(value.JT808_0x0900_BodyBase.GetType()); offset = JT808FormatterResolverExtensions.JT808DynamicSerialize(obj, ref bytes, offset, value, formatterResolver); return(offset); }
public int Serialize(ref byte[] bytes, int offset, JT808_0x8804 value, IJT808FormatterResolver formatterResolver) { offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.RecordCmd); offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.RecordTime); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.RecordSave); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.AudioSampleRate); return(offset); }
public JT808_0x8500 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { offset = 0; JT808_0x8500 jT808_0X8500 = new JT808_0x8500(); jT808_0X8500.ControlFlag = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset); readSize = offset; return(jT808_0X8500); }
public JT808_0x0102 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { offset = 0; JT808_0x0102 jT808_0X0102 = new JT808_0x0102(); jT808_0X0102.Code = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset); readSize = offset; return(jT808_0X0102); }
public JT808_0x8805 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { offset = 0; JT808_0x8805 jT808_0X8805 = new JT808_0x8805(); jT808_0X8805.MultimediaId = JT808BinaryExtensions.ReadInt32Little(bytes, ref offset); jT808_0X8805.Deleted = (JT808MultimediaDeleted)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset); readSize = offset; return(jT808_0X8805); }
public JT808_0x0108 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { offset = 0; JT808_0x0108 jT808_0X0108 = new JT808_0x0108(); jT808_0X0108.UpgradeType = (JT808UpgradeType)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset); jT808_0X0108.UpgradeResult = (JT808UpgradeResult)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset); readSize = offset; return(jT808_0X0108); }
public JT808_0x0500 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { offset = 0; JT808_0x0500 jT808_0X0500 = new JT808_0x0500(); jT808_0X0500.MsgNum = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset); jT808_0X0500.JT808_0x0200 = formatterResolver.GetFormatter <JT808_0x0200>().Deserialize(bytes.Slice(offset), offset, formatterResolver, out readSize); readSize = offset; return(jT808_0X0500); }
public int Serialize(ref byte[] bytes, int offset, JT808_0x8108 value, IJT808FormatterResolver formatterResolver) { offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.UpgradeType); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.MakerId.PadRight(5, '0')); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.VersionNum.Length); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.VersionNum); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.UpgradePackage.Length); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.UpgradePackage); return(offset); }
public JT808_0x8202 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { offset = 0; JT808_0x8202 jT808_0X8202 = new JT808_0x8202(); jT808_0X8202.Interval = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset); jT808_0X8202.LocationTrackingValidity = JT808BinaryExtensions.ReadInt32Little(bytes, ref offset); readSize = offset; return(jT808_0X8202); }
public int Serialize(ref byte[] bytes, int offset, JT808_0x8100 value, IJT808FormatterResolver formatterResolver) { offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.MsgNum); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.JT808TerminalRegisterResult); // 只有在成功后才有该字段 if (value.JT808TerminalRegisterResult == JT808TerminalRegisterResult.成功) { offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.Code); } return(offset); }
public JT808_0x8400 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { offset = 0; JT808_0x8400 jT808_0X8400 = new JT808_0x8400(); jT808_0X8400.CallBack = (JT808CallBackType)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset); // 最长为 20 字节 jT808_0X8400.PhoneNumber = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset); readSize = offset; return(jT808_0X8400); }
public JT808_0x0001 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { offset = 0; JT808_0x0001 jT808_0X0001 = new JT808_0x0001(); jT808_0X0001.MsgNum = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset); jT808_0X0001.MsgId = (JT808MsgId)JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset); jT808_0X0001.JT808TerminalResult = (JT808TerminalResult)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset); readSize = offset; return(jT808_0X0001); }
public int Serialize(ref byte[] bytes, int offset, JT808_0x0100 value, IJT808FormatterResolver formatterResolver) { offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.AreaID); offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.CityOrCountyId); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.MakerId.PadRight(5, '0')); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.TerminalModel.PadRight(20, '0')); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.TerminalId.PadRight(7, '0')); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.PlateColor); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.PlateNo); return(offset); }
public JT808_0x8804 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { offset = 0; JT808_0x8804 jT808_0X8804 = new JT808_0x8804(); jT808_0X8804.RecordCmd = (JT808RecordCmd)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset); jT808_0X8804.RecordTime = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset); jT808_0X8804.RecordSave = (JT808RecordSave)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset); jT808_0X8804.AudioSampleRate = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset); readSize = offset; return(jT808_0X8804); }
public JT808_0x0900 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { offset = 0; JT808_0x0900 jT808_0x0900 = new JT808_0x0900(); jT808_0x0900.PassthroughType = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset); if (JT808_0x0900_BodyBase.JT808_0x0900Method.TryGetValue(jT808_0x0900.PassthroughType, out Type type)) { jT808_0x0900.JT808_0x0900_BodyBase = JT808FormatterResolverExtensions.JT808DynamicDeserialize(formatterResolver.GetFormatterDynamic(type), bytes.Slice(offset), offset, formatterResolver, out readSize); } readSize = offset; return(jT808_0x0900); }
public int Serialize(ref byte[] bytes, int offset, JT808_0x8401 value, IJT808FormatterResolver formatterResolver) { offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.SettingTelephoneBook); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.JT808ContactProperties.Count); foreach (var item in value.JT808ContactProperties) { offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)item.TelephoneBookContactType); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)item.PhoneNumber.Length); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, item.PhoneNumber); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)item.Contact.Length); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, item.Contact); } return(offset); }
public JT808_0x8108 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { offset = 0; JT808_0x8108 jT808_0X8108 = new JT808_0x8108(); jT808_0X8108.UpgradeType = (JT808UpgradeType)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset); jT808_0X8108.MakerId = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset, 5); jT808_0X8108.VersionNumLength = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset); jT808_0X8108.VersionNum = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset, jT808_0X8108.VersionNumLength); jT808_0X8108.UpgradePackageLength = JT808BinaryExtensions.ReadInt32Little(bytes, ref offset); jT808_0X8108.UpgradePackage = JT808BinaryExtensions.ReadBytesLittle(bytes, ref offset, jT808_0X8108.UpgradePackageLength); readSize = offset; return(jT808_0X8108); }
public int Serialize(ref byte[] bytes, int offset, JT808_0x0107 value, IJT808FormatterResolver formatterResolver) { offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.TerminalType); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.MakerId.PadRight(5, '0')); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.TerminalModel.PadRight(20, '0')); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.TerminalId.PadRight(7, '0')); offset += JT808BinaryExtensions.WriteBCDLittle(ref bytes, offset, value.Terminal_SIM_ICCID, 5, 10); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.Terminal_Hardware_Version_Num.Length); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.Terminal_Hardware_Version_Num); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.Terminal_Firmware_Version_Num.Length); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.Terminal_Firmware_Version_Num); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.GNSSModule); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.CommunicationModule); return(offset); }
public JT808_0x0100 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { offset = 0; JT808_0x0100 jT808_0X0100 = new JT808_0x0100(); jT808_0X0100.AreaID = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset); jT808_0X0100.CityOrCountyId = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset); jT808_0X0100.MakerId = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset, 5); jT808_0X0100.TerminalModel = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset, 20); jT808_0X0100.TerminalId = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset, 7); jT808_0X0100.PlateColor = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset); jT808_0X0100.PlateNo = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset); readSize = offset; return(jT808_0X0100); }
public JT808_0x8100 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { offset = 0; JT808_0x8100 jT808_0X8100 = new JT808_0x8100(); jT808_0X8100.MsgNum = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset); jT808_0X8100.JT808TerminalRegisterResult = (JT808TerminalRegisterResult)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset); // 只有在成功后才有该字段 if (jT808_0X8100.JT808TerminalRegisterResult == JT808TerminalRegisterResult.成功) { jT808_0X8100.Code = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset); } readSize = offset; return(jT808_0X8100); }
public JT808Header Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize) { JT808Header jT808Header = new JT808Header(); // 1.消息ID jT808Header.MsgId = (JT808MsgId)JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset); // 2.消息体属性 jT808Header.MessageBodyProperty = formatterResolver.GetFormatter <JT808HeaderMessageBodyProperty>().Deserialize(bytes, offset, formatterResolver, out readSize); offset += readSize; // 3.终端手机号 (写死大陆手机号码) jT808Header.TerminalPhoneNo = JT808BinaryExtensions.ReadBCD(bytes, ref offset, 6).ToString().PadLeft(12, '0'); // 4.消息流水号 jT808Header.MsgNum = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset); readSize = offset; return(jT808Header); }
public int Serialize(ref byte[] bytes, int offset, JT808Package value, IJT808FormatterResolver formatterResolver) { // 1. 先判断是否分包(理论下发不需分包,但为了统一还是加上分包处理) // 2. 先序列化数据体,根据数据体的长度赋值给头部,在序列化头部。 int messageBodyOffset = 0; if (value.Header.MessageBodyProperty.IsPackge) { //3. 先写入分包消息总包数、包序号 messageBodyOffset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, messageBodyOffset, value.Header.MessageBodyProperty.PackgeCount); messageBodyOffset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, messageBodyOffset, value.Header.MessageBodyProperty.PackageIndex); } // 4. 数据体 //JT808.Protocol.Enums.JT808MsgId 映射对应消息特性 JT808BodiesTypeAttribute jT808BodiesTypeAttribute = value.Header.MsgId.GetAttribute <JT808BodiesTypeAttribute>(); if (jT808BodiesTypeAttribute != null) { if (value.Bodies != null) { // 4.1 处理数据体 messageBodyOffset = JT808FormatterResolverExtensions.JT808DynamicSerialize(formatterResolver.GetFormatterDynamic(jT808BodiesTypeAttribute.JT808BodiesType), ref bytes, offset, value.Bodies, formatterResolver); } } byte[] messageBodyBytes = null; if (messageBodyOffset != 0) { messageBodyBytes = bytes.AsSpan().Slice(0, messageBodyOffset).ToArray(); } // ------------------------------------开始组包 // 1.起始符 offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.Begin); // 2.赋值头数据长度 value.Header.MessageBodyProperty.DataLength = messageBodyOffset; offset = formatterResolver.GetFormatter <JT808Header>().Serialize(ref bytes, offset, value.Header, formatterResolver); if (messageBodyOffset != 0) { Buffer.BlockCopy(messageBodyBytes, 0, bytes, offset, messageBodyOffset); offset += messageBodyOffset; } // 4.校验码 offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, bytes.ToXor(1, offset)); // 5.终止符 offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.End); byte[] temp = JT808Escape(bytes.AsSpan().Slice(0, offset)); Buffer.BlockCopy(temp, 0, bytes, 0, temp.Length); return(temp.Length); }
public int Serialize(ref byte[] bytes, int offset, JT808Header value, IJT808FormatterResolver formatterResolver) { // 1.消息ID offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, (ushort)value.MsgId); //2.消息体属性 offset = formatterResolver.GetFormatter <JT808HeaderMessageBodyProperty>().Serialize(ref bytes, offset, value.MessageBodyProperty, formatterResolver); // 3.终端手机号 (写死大陆手机号码) offset += JT808BinaryExtensions.WriteBCDLittle(ref bytes, offset, value.TerminalPhoneNo, 6, 12); //消息流水号 offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.MsgNum); if (value.MessageBodyProperty.IsPackge) { //消息总包数2位+包序号2位=4位 offset += 4; } return(offset); }
public static JT808Package Deserialize(ReadOnlySpan <byte> bytes, IJT808FormatterResolver resolver) { try { if (resolver == null) { resolver = DefaultResolver; } var formatter = resolver.GetFormatter <JT808Package>(); int readSize; return(formatter.Deserialize(bytes, 0, resolver, out readSize)); } catch (Exception ex) { throw new Exception("Deserialize", ex); } }
public int Serialize(ref byte[] bytes, int offset, JT808_0x0704 value, IJT808FormatterResolver formatterResolver) { offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.Count); offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.LocationType); foreach (var item in value?.Positions) { try { // 需要反着来,先序列化数据体(由于位置汇报数据体长度为2个字节,所以先偏移2个字节),再根据数据体的长度设置回去 int positionOffset = formatterResolver.GetFormatter <JT808_0x0200>().Serialize(ref bytes, offset + 2, item, formatterResolver); JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, (ushort)(positionOffset - offset - 2)); offset = positionOffset; } catch (Exception ex) { } } return(offset); }