using JT809.Protocol.JT809Attributes; using JT809.Protocol.JT809Enums; using JT809.Protocol.JT809Exceptions; using JT809.Protocol.JT809Extensions; using JT809.Protocol.JT809MessageBody; using System; using System.Buffers; using System.Collections.Generic; using System.Text; namespace JT809.Protocol.JT809Formatters.JT809MessageBodyFormatters { public class JT809_0x9300Formatter : IJT809Formatter { public JT809_0x9300 Deserialize(ReadOnlySpan bytes, out int readSize) { int offset = 0; JT809_0x9300 jT809_0X9300 = new JT809_0x9300(); jT809_0X9300.SubBusinessType = (JT809SubBusinessType)JT809BinaryExtensions.ReadUInt16Little(bytes, ref offset); jT809_0X9300.DataLength = JT809BinaryExtensions.ReadUInt32Little(bytes, ref offset); //JT809.Protocol.JT809Enums.JT809BusinessType 映射对应消息特性 JT809BodiesTypeAttribute jT809SubBodiesTypeAttribute = jT809_0X9300.SubBusinessType.GetAttribute(); if (jT809SubBodiesTypeAttribute == null) { throw new JT809Exception(JT809ErrorCode.GetAttributeError, $"JT809BodiesTypeAttribute Not Found>{jT809_0X9300.SubBusinessType.ToString()}"); } try { jT809_0X9300.JT809SubBodies = JT809FormatterResolverExtensions.JT809DynamicDeserialize(JT809FormatterExtensions.GetFormatter(jT809SubBodiesTypeAttribute.JT809BodiesType), bytes.Slice(offset, (int)jT809_0X9300.DataLength), out readSize); } catch { throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{jT809_0X9300.SubBusinessType.ToString()}"); } readSize = offset; return jT809_0X9300; } public int Serialize(IMemoryOwner memoryOwner, int offset, JT809_0x9300 value) { offset += JT809BinaryExtensions.WriteUInt16Little(memoryOwner, offset, (ushort)value.SubBusinessType); //offset += JT809BinaryExtensions.WriteUInt32Little(memoryOwner, offset, value.DataLength); //JT809.Protocol.JT809Enums.JT809BusinessType 映射对应消息特性 JT809BodiesTypeAttribute jT809SubBodiesTypeAttribute = value.SubBusinessType.GetAttribute(); if (jT809SubBodiesTypeAttribute == null) { throw new JT809Exception(JT809ErrorCode.GetAttributeError, $"JT809BodiesTypeAttribute Not Found>{value.SubBusinessType.ToString()}"); } try { // 先写入内容,然后在根据内容反写内容长度 offset = offset + 4; int contentOffset = JT809FormatterResolverExtensions.JT809DynamicSerialize(JT809FormatterExtensions.GetFormatter(jT809SubBodiesTypeAttribute.JT809BodiesType), memoryOwner, offset, value.JT809SubBodies); JT809BinaryExtensions.WriteUInt32Little(memoryOwner, offset - 4, (uint)(contentOffset - offset)); offset = contentOffset; } catch { throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); } return offset; } } }