using Edge.Core.Parser.BinaryParser; using Edge.Core.Parser.BinaryParser.MessageEntity; using Edge.Core.Parser.BinaryParser.Util; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Dfs.WayneChina.HengshanTerminalWrapper { public class Parser : ParserBase { public Parser() : base(new MessageTemplateLookup()) { IgnoreExtraTailBytesInDeserialize = true; } public override byte[] Serialize(MessageTemplateBase message) { var bytesWithXRL = base.Serialize(message).ToList(); if (message.GetType().GetProperty("XRL") != null) { ProcessXRLInMsgBody(ref bytesWithXRL); } return bytesWithXRL.ToArray(); } private void ProcessXRLInMsgBody(ref List<byte> bytesWithXRL) { var bytesUsedToComputeXRL = bytesWithXRL.GetRange(2, bytesWithXRL.Count - 3).ToArray(); byte XRL = 0; foreach (var b in bytesUsedToComputeXRL) { XRL = (byte)(XRL ^ b); } if (XRL == 0xFF) XRL = 0xEE; bytesWithXRL[bytesWithXRL.Count - 1] = XRL; } /// <summary> /// 转义字符:0FAH;在数据里每两个 0FAH 替换为一个 0FAH;在目标地址、源地址、帧号/控制、 ///有效数据长度中不能出现 0FAH,转义字符不计入 CRC 中,CRC 中采用转义。 /// </summary> /// <param name="original"></param> /// <returns></returns> public static byte[] ProcessDoubleHexFAInMsgBody(List<byte> original) { //====record 0xFA position============ var indexs = new List<int>(); for (int i = 6; i < original.Count; i++) { if (original[i] == 0xFA) { indexs.Add(i); } } //=====end===== if (!indexs.Any()) return original.ToArray(); var originalLen = original.Skip(4).Take(2).GetBCD(); //var newLen = (originalLen + indexs.Count).GetBCDBytes(2); var newLen = (originalLen).GetBCDBytes(2); original[4] = newLen[0]; original[5] = newLen[1]; byte[] _ = new byte[original.Count]; original.CopyTo(_); var newList = _.ToList(); for (int i = 0; i < indexs.Count; i++) { newList.Insert(indexs[i] + i, 0xFA); } return newList.ToArray(); } public static byte[] ProcessDoubleHexFAInCRC(byte[] originalCrc) { var result = new List<byte>(); result.Add(originalCrc[0]); if (originalCrc[0] == 0xFA) { result.Add(0xFA); } result.Add(originalCrc[1]); if (originalCrc[1] == 0xFA) { result.Add(0xFA); } return result.ToArray(); } } }