using JT809.Protocol.Attributes; using JT809.Protocol.Enums; using JT809.Protocol.Exceptions; using JT809.Protocol.Extensions; using JT809.Protocol.Interfaces; using JT809.Protocol.MessagePack; using System; namespace JT809.Protocol.Formatters { public class JT809HeaderPackageFormatter : IJT809MessagePackFormatter { public readonly static JT809HeaderPackageFormatter Instance = new JT809HeaderPackageFormatter(); public JT809HeaderPackage Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { // 1. 验证校验码 if (!config.SkipCRCCode) { // 1.2. 验证校验码 if (!reader.CheckXorCodeVali) { throw new JT809Exception(JT809ErrorCode.CRC16CheckInvalid, $"{reader.CalculateCheckXorCode.ToString()}!={reader.RealCheckXorCode.ToString()}"); } } JT809HeaderPackage jT809Package = new JT809HeaderPackage(); // 2.读取起始头 jT809Package.BeginFlag = reader.ReadStart(); // 3.初始化消息头 try { jT809Package.Header = JT809HeaderFormatter.Instance.Deserialize(ref reader, config); } catch (Exception ex) { throw new JT809Exception(JT809ErrorCode.HeaderParseError, $"offset>{reader.ReadCurrentRemainContentLength().ToString()}", ex); } // 5.数据体处理 // 5.1 判断是否有数据体(总长度-固定长度)> 0 if ((jT809Package.Header.MsgLength - JT809Package.FixedByteLength) > 0) { try { // 5.2 是否加密 switch (jT809Package.Header.EncryptFlag) { case JT809Header_Encrypt.None: // 5.3 处理消息体 jT809Package.Bodies = reader.ReadContent().ToArray(); break; case JT809Header_Encrypt.Common: // 5.4. 处理加密消息体 byte[] bodiesData = config.Encrypt.Decrypt(reader.ReadContent(), config.EncryptOptions, jT809Package.Header.EncryptKey); jT809Package.Bodies = bodiesData; break; } } catch (Exception ex) { throw new JT809Exception(JT809ErrorCode.BodiesParseError, $"offset>{reader.ReadCurrentRemainContentLength().ToString()}", ex); } } jT809Package.CRCCode = reader.CalculateCheckXorCode; jT809Package.EndFlag = reader.ReadEnd(); return jT809Package; } public void Serialize(ref JT809MessagePackWriter writer, JT809HeaderPackage value, IJT809Config config) { throw new NotImplementedException("只适用反序列化"); } } }