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; using System.Threading.Tasks; namespace LanTian_Sinopec_PumpIcCardReader { public class Parser : ParserBase { public Parser() : base(MessageTemplateLookup.Default) { } public override byte[] Serialize(MessageTemplateBase message) { var bytesWithoutCrc16 = base.Serialize(message).ToList(); if (message.GetType().GetProperty("CRC16") != null) { // skip the first of 0xFA. var crc16 = bytesWithoutCrc16.Skip(1).ToArray().ComputeChecksumBytesCrc16(); var processedBody = ProcessDoubleHexFAInMsgBody(bytesWithoutCrc16); var processedCrc = ProcessDoubleHexFAInCRC(crc16); var _ = processedBody.Concat(processedCrc); return _.ToArray(); } return bytesWithoutCrc16.ToArray(); } /// /// 转义字符:0FAH;在数据里每两个 0FAH 替换为一个 0FAH;在目标地址、源地址、帧号/控制、 ///有效数据长度中不能出现 0FAH,转义字符不计入 CRC 中,CRC 中采用转义。 /// /// /// public static byte[] ProcessDoubleHexFAInMsgBody(List original) { //====record 0xFA position============ var indexs = new List(); 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(); 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(); } } }