Parser.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using Edge.Core.Parser.BinaryParser;
  2. using Edge.Core.Parser.BinaryParser.MessageEntity;
  3. using Edge.Core.Parser.BinaryParser.Util;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using WayneChina_IcCardReader_SinoChem.MessageEntity;
  10. namespace WayneChina_IcCardReader_SinoChem
  11. {
  12. public class Parser : ParserBase
  13. {
  14. private int crcType;
  15. public Parser(int crcType) : base(new MessageTemplateLookup())
  16. {
  17. this.crcType = crcType;
  18. }
  19. public override byte[] Serialize(MessageTemplateBase message)
  20. {
  21. var bytesWithoutCrc16 = base.Serialize(message).ToList();
  22. if (message.GetType().GetProperty("CRC") != null)
  23. {
  24. byte[] crc16;
  25. // skip the first of 0xFA.
  26. if (crcType == 1) // Wayne
  27. {
  28. crc16 = bytesWithoutCrc16.Skip(1).ToArray().ComputeChecksumBytesCrc16().Reverse().ToArray();
  29. }
  30. else if (crcType == 2) // Tokheim
  31. {
  32. crc16 = bytesWithoutCrc16.Skip(1).ToArray().Crc16Ccitt().ToArray();
  33. }
  34. else
  35. {
  36. crc16 = new byte[2] { 0xEE, 0xEE };
  37. }
  38. var processedBody = ProcessDoubleHexFAInMsgBody(bytesWithoutCrc16);
  39. var processedCrc = ProcessDoubleHexFAInCRC(crc16);
  40. var _ = processedBody.Concat(processedCrc);
  41. return _.ToArray();
  42. }
  43. return bytesWithoutCrc16.ToArray();
  44. }
  45. /// <summary>
  46. /// 转义字符:0FAH;在数据里每两个 0FAH 替换为一个 0FAH;在目标地址、源地址、帧号/控制、
  47. ///有效数据长度中不能出现 0FAH,转义字符不计入 CRC 中,CRC 中采用转义。
  48. /// </summary>
  49. /// <param name="original"></param>
  50. /// <returns></returns>
  51. private static byte[] ProcessDoubleHexFAInMsgBody(List<byte> original)
  52. {
  53. //====record 0xFA position============
  54. var indexs = new List<int>();
  55. for (int i = 4; i < original.Count; i++)
  56. {
  57. if (original[i] == 0xFA)
  58. {
  59. indexs.Add(i);
  60. }
  61. }
  62. //=====end=====
  63. if (!indexs.Any()) return original.ToArray();
  64. var originalLen = original.Skip(2).Take(2).GetBCD();
  65. //var newLen = (originalLen + indexs.Count).GetBCDBytes(2);
  66. var newLen = (originalLen).GetBCDBytes(2);
  67. original[2] = newLen[0];
  68. original[3] = newLen[1];
  69. byte[] _ = new byte[original.Count];
  70. original.CopyTo(_);
  71. var newList = _.ToList();
  72. for (int i = 0; i < indexs.Count; i++)
  73. {
  74. newList.Insert(indexs[i] + i, 0xFA);
  75. }
  76. return newList.ToArray();
  77. }
  78. private static byte[] ProcessDoubleHexFAInCRC(byte[] originalCrc)
  79. {
  80. var result = new List<byte>();
  81. result.Add(originalCrc[0]);
  82. if (originalCrc[0] == 0xFA)
  83. {
  84. result.Add(0xFA);
  85. }
  86. result.Add(originalCrc[1]);
  87. if (originalCrc[1] == 0xFA)
  88. {
  89. result.Add(0xFA);
  90. }
  91. return result.ToArray();
  92. }
  93. //public override MessageTemplateBase Deserialize(byte[] rawData)
  94. //{
  95. // // skip first 0xFA
  96. // return base.Deserialize(rawData.Skip(1).ToArray());
  97. //}
  98. //public override MessageTemplateBase Deserialize(byte[] rawData, MessageTemplateBase withTemplate)
  99. //{
  100. // // skip first 0xFA
  101. // return base.Deserialize(rawData.Skip(1).ToArray(), withTemplate);
  102. //}
  103. }
  104. }