Parser.cs 3.0 KB

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