Parser.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. namespace HengShan_Pump_NonIC_Plus
  8. {
  9. public class Parser : ParserBase
  10. {
  11. protected static NLog.Logger logger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("Communicator");
  12. public Parser() : base(new MessageTemplateLookup())
  13. {
  14. }
  15. public override byte[] Serialize(MessageTemplateBase message)
  16. {
  17. List<byte> bytesWithXRL = null;
  18. try
  19. {
  20. bytesWithXRL = base.Serialize(message).ToList();
  21. if (message.GetType().GetProperty("XRL") != null)
  22. {
  23. bytesWithXRL[bytesWithXRL.Count - 1] = ProcessXRLInMsgBody(bytesWithXRL);
  24. ProcessXRLInMsgBody(bytesWithXRL);
  25. }
  26. return bytesWithXRL.ToArray();
  27. }
  28. catch (Exception exxx)
  29. {
  30. string logStr = message?.GetType().Name ?? "";
  31. if (message != null)
  32. try { logStr += System.Environment.NewLine + message.ToLogString(); }
  33. catch { }
  34. if (bytesWithXRL != null && bytesWithXRL.Any())
  35. try { logStr += System.Environment.NewLine + bytesWithXRL.ToHexLogString(); }
  36. catch { }
  37. logger.Info("Serialize HengShanNonIC message: " + logStr + System.Environment.NewLine
  38. + " exceptioned, detail: " + exxx);
  39. throw;
  40. }
  41. }
  42. public override MessageTemplateBase Deserialize(byte[] rawData)
  43. {
  44. var pendingForXrlBytes = rawData.SkipLast(1).ToList();
  45. var xrlOri = rawData.Skip(pendingForXrlBytes.Count).First();
  46. var xrl = ProcessXRLInMsgBody(pendingForXrlBytes);
  47. return base.Deserialize(pendingForXrlBytes.ToArray());
  48. }
  49. private byte ProcessXRLInMsgBody(List<byte> bytesWithXRL)
  50. {
  51. var bytesUsedToComputeXRL = bytesWithXRL.GetRange(3, bytesWithXRL.Count - 3).ToArray();
  52. byte XRL = 0;
  53. foreach (var b in bytesUsedToComputeXRL)
  54. {
  55. XRL = (byte)(XRL ^ b);
  56. }
  57. if (XRL == 0x9F)
  58. XRL = 0xEE;
  59. return XRL;
  60. }
  61. }
  62. }