using Parser.BinaryParser; using Parser.BinaryParser.MessageEntity; using Parser.BinaryParser.Util; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WayneChina_IcCardReader_SinoChem.MessageEntity; namespace WayneChina_IcCardReader_SinoChem { public class Parser : ParserBase { public Parser() : base(new MessageTemplateLookup()) { } public override byte[] Serialize(MessageTemplateBase message) { var bytesWithoutCrc16 = base.Serialize(message).ToList(); if (message.GetType().GetProperty("CRC") != null) { // skip the first of 0xFA. var crc16 = bytesWithoutCrc16.Skip(1).ToArray().ComputeChecksumBytesCrc16().Reverse().ToArray(); var processedBody = ProcessDoubleHexFAInMsgBody(bytesWithoutCrc16); var processedCrc = ProcessDoubleHexFAInCRC(crc16); var _ = processedBody.Concat(processedCrc); return _.ToArray(); } return bytesWithoutCrc16.ToArray(); } /// /// 转义字符:0FAH;在数据里每两个 0FAH 替换为一个 0FAH;在目标地址、源地址、帧号/控制、 ///有效数据长度中不能出现 0FAH,转义字符不计入 CRC 中,CRC 中采用转义。 /// /// /// private static byte[] ProcessDoubleHexFAInMsgBody(List original) { //====record 0xFA position============ var indexs = new List(); for (int i = 4; i < original.Count; i++) { if (original[i] == 0xFA) { indexs.Add(i); } } //=====end===== if (!indexs.Any()) return original.ToArray(); var originalLen = original.Skip(2).Take(2).GetBCD(); //var newLen = (originalLen + indexs.Count).GetBCDBytes(2); var newLen = (originalLen).GetBCDBytes(2); original[2] = newLen[0]; original[3] = 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(); } private 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(); } //public override MessageTemplateBase Deserialize(byte[] rawData) //{ // // skip first 0xFA // return base.Deserialize(rawData.Skip(1).ToArray()); //} //public override MessageTemplateBase Deserialize(byte[] rawData, MessageTemplateBase withTemplate) //{ // // skip first 0xFA // return base.Deserialize(rawData.Skip(1).ToArray(), withTemplate); //} } }