Parser.cs 3.3 KB

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