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 Gilbarco_Pump { public class Parser : ParserBase { public Parser() : base(MessageTemplateLookup.Default) { } public override byte[] Serialize(Edge.Core.Parser.BinaryParser.MessageEntity.MessageTemplateBase message) { var fullBytes = base.Serialize(message).ToList(); var validatingParts = fullBytes.Skip(1).Take(fullBytes.Count - 1); // skip the first of 0xFA. var checksum = CaculateCheckSum(validatingParts.ToArray()); var _ = fullBytes.Concat(new byte[] { checksum }); return _.ToArray(); } public override Edge.Core.Parser.BinaryParser.MessageEntity.MessageTemplateBase Deserialize(byte[] rawData) { var m = base.Deserialize(rawData.Take(rawData.Length - 1).ToArray()) as Gilbarco_Pump.MessageTemplateBase; m.CheckSum = rawData.Last(); return m; } /// /// 转义字符: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(); } public static byte CaculateCheckSum(byte[] bytes) { var lowerSum = 0; var higherSum = 0; for (int i = 0; i < bytes.Length; i++) { lowerSum += bytes[i] & 0x0F; higherSum += (bytes[i] & 0xF0) >> 4; } return (byte)(lowerSum ^ higherSum); } } }