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