Parser.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. namespace LanTian_Sinopec_PumpIcCardReader
  10. {
  11. public class Parser : ParserBase
  12. {
  13. public Parser() : base(MessageTemplateLookup.Default)
  14. {
  15. }
  16. public override byte[] Serialize(MessageTemplateBase message)
  17. {
  18. var bytesWithoutCrc16 = base.Serialize(message).ToList();
  19. if (message.GetType().GetProperty("CRC16") != null)
  20. {
  21. // skip the first of 0xFA.
  22. var crc16 = bytesWithoutCrc16.Skip(1).ToArray().ComputeChecksumBytesCrc16();
  23. var processedBody = ProcessDoubleHexFAInMsgBody(bytesWithoutCrc16);
  24. var processedCrc = ProcessDoubleHexFAInCRC(crc16);
  25. var _ = processedBody.Concat(processedCrc);
  26. return _.ToArray();
  27. }
  28. return bytesWithoutCrc16.ToArray();
  29. }
  30. /// <summary>
  31. /// 转义字符:0FAH;在数据里每两个 0FAH 替换为一个 0FAH;在目标地址、源地址、帧号/控制、
  32. ///有效数据长度中不能出现 0FAH,转义字符不计入 CRC 中,CRC 中采用转义。
  33. /// </summary>
  34. /// <param name="original"></param>
  35. /// <returns></returns>
  36. public static byte[] ProcessDoubleHexFAInMsgBody(List<byte> original)
  37. {
  38. //====record 0xFA position============
  39. var indexs = new List<int>();
  40. for (int i = 6; i < original.Count; i++)
  41. {
  42. if (original[i] == 0xFA)
  43. {
  44. indexs.Add(i);
  45. }
  46. }
  47. //=====end=====
  48. if (!indexs.Any()) return original.ToArray();
  49. var originalLen = original.Skip(4).Take(2).GetBCD();
  50. //var newLen = (originalLen + indexs.Count).GetBCDBytes(2);
  51. var newLen = (originalLen).GetBCDBytes(2);
  52. original[4] = newLen[0];
  53. original[5] = newLen[1];
  54. byte[] _ = new byte[original.Count];
  55. original.CopyTo(_);
  56. var newList = _.ToList();
  57. for (int i = 0; i < indexs.Count; i++)
  58. {
  59. newList.Insert(indexs[i] + i, 0xFA);
  60. }
  61. return newList.ToArray();
  62. }
  63. public static byte[] ProcessDoubleHexFAInCRC(byte[] originalCrc)
  64. {
  65. var result = new List<byte>();
  66. result.Add(originalCrc[0]);
  67. if (originalCrc[0] == 0xFA)
  68. {
  69. result.Add(0xFA);
  70. }
  71. result.Add(originalCrc[1]);
  72. if (originalCrc[1] == 0xFA)
  73. {
  74. result.Add(0xFA);
  75. }
  76. return result.ToArray();
  77. }
  78. }
  79. }