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();
}
}
}