Parser.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using Edge.Core.Parser.BinaryParser.MessageEntity;
  2. using Edge.Core.Parser.BinaryParser.Util;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace Edge.Core.Parser.BinaryParser
  9. {
  10. public class Parser : ParserBase
  11. {
  12. public override byte[] Serialize(MessageTemplateBase message)
  13. {
  14. var fullBytesWithoutLRC = base.Serialize(message);
  15. if (message.GetType().GetProperty("LRC") != null)
  16. {
  17. var lrc = fullBytesWithoutLRC.CalculateLRC();
  18. var _ = fullBytesWithoutLRC.Concat(new byte[] { lrc });
  19. return _.ToArray();
  20. }
  21. return fullBytesWithoutLRC.ToArray();
  22. }
  23. /// <summary>
  24. /// 转义字符:0FAH;在数据里每两个 0FAH 替换为一个 0FAH;在目标地址、源地址、帧号/控制、
  25. ///有效数据长度中不能出现 0FAH,转义字符不计入 CRC 中,CRC 中采用转义。
  26. /// </summary>
  27. /// <param name="original"></param>
  28. /// <returns></returns>
  29. public static byte[] ProcessDoubleHexFAInMsgBody(List<byte> original)
  30. {
  31. //====record 0xFA position============
  32. var indexs = new List<int>();
  33. for (int i = 6; i < original.Count; i++)
  34. {
  35. if (original[i] == 0xFA)
  36. {
  37. indexs.Add(i);
  38. }
  39. }
  40. //=====end=====
  41. if (!indexs.Any()) return original.ToArray();
  42. var originalLen = original.Skip(4).Take(2).GetBCD();
  43. //var newLen = (originalLen + indexs.Count).GetBCDBytes(2);
  44. var newLen = (originalLen).GetBCDBytes(2);
  45. original[4] = newLen[0];
  46. original[5] = newLen[1];
  47. byte[] _ = new byte[original.Count];
  48. original.CopyTo(_);
  49. var newList = _.ToList();
  50. for (int i = 0; i < indexs.Count; i++)
  51. {
  52. newList.Insert(indexs[i] + i, 0xFA);
  53. }
  54. return newList.ToArray();
  55. }
  56. public static byte[] ProcessDoubleHexFAInCRC(byte[] originalCrc)
  57. {
  58. var result = new List<byte>();
  59. result.Add(originalCrc[0]);
  60. if (originalCrc[0] == 0xFA)
  61. {
  62. result.Add(0xFA);
  63. }
  64. result.Add(originalCrc[1]);
  65. if (originalCrc[1] == 0xFA)
  66. {
  67. result.Add(0xFA);
  68. }
  69. return result.ToArray();
  70. }
  71. }
  72. }