电子药箱通讯服务端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RfidMarshalEndian.cs 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace Rdh.SocketServer.Client.Models
  5. {
  6. public class RfidMarshalEndian
  7. {
  8. private readonly int ConstLength = 15; //最小包长
  9. private List<byte> leftBytes = new List<byte>(); //历史遗留包数据
  10. private readonly byte head1 = 0xA5; //自定义头1
  11. public byte[] Encode(RfidFixedHeaderRequestInfo msg)
  12. {
  13. var bytes = new List<byte>();
  14. bytes.AddRange(msg.Header);
  15. bytes.AddRange(msg.Body);
  16. return bytes.ToArray();
  17. }
  18. public List<RfidFixedHeaderRequestInfo> GetSendSockets(byte[] buffer, int len)
  19. {
  20. if (buffer == null) return new List<RfidFixedHeaderRequestInfo>();
  21. //拷贝当前有效数据
  22. var bytes = new byte[len];
  23. Buffer.BlockCopy(buffer, 0, bytes, 0, len);
  24. //合并上个包的遗留数据
  25. if (leftBytes.Count > 0)
  26. {
  27. leftBytes.AddRange(bytes);
  28. bytes = leftBytes.ToArray();
  29. leftBytes.Clear();
  30. leftBytes = new List<byte>();
  31. }
  32. var sendSockets = new List<RfidFixedHeaderRequestInfo>();
  33. while (bytes.Length > 0 || leftBytes.Count > 0)
  34. {
  35. if (bytes.Length < ConstLength)
  36. {
  37. leftBytes.AddRange(bytes);
  38. return sendSockets;
  39. }
  40. //寻找head1的索引
  41. var isFind = false;
  42. var headIndex = 0;
  43. while (headIndex < bytes.Length)
  44. {
  45. if (bytes[headIndex] == head1)
  46. {
  47. isFind = true;
  48. break;
  49. }
  50. headIndex++;
  51. isFind = false;
  52. }
  53. if (!isFind)
  54. {
  55. leftBytes.AddRange(bytes);
  56. return sendSockets;
  57. }
  58. if (headIndex + 1 == bytes.Length)
  59. {
  60. leftBytes.AddRange(bytes);
  61. return sendSockets;
  62. }
  63. //寻找foot1的索引
  64. var lenTmp = bytes[headIndex + 1];
  65. if (bytes.Length < lenTmp + 2)
  66. {
  67. leftBytes.AddRange(bytes);
  68. return sendSockets;
  69. }
  70. //提取一个完整包数据 并解析
  71. var packBuffer = bytes.Skip(headIndex).Take(lenTmp + 2).ToArray();
  72. //if (Check(packBuffer))
  73. {
  74. //将byte数组转为数据实体
  75. var sendSocket = new RfidFixedHeaderRequestInfo();
  76. sendSocket.OnParsingHeader(packBuffer.Take(5).ToArray());
  77. sendSocket.OnParsingBody(packBuffer.Skip(5).ToArray());
  78. sendSockets.Add(sendSocket);
  79. //留存剩余的包数据
  80. bytes = bytes.Skip(headIndex + lenTmp + 2).ToArray();
  81. }
  82. }
  83. return sendSockets;
  84. }
  85. public bool Check(byte[] buffer)
  86. {
  87. var sum = buffer.SkipLast(1).Select(x => (int)x).Sum();
  88. var bytes = Convert.ToString(sum, 2)
  89. .Select(x => byte.Parse(x.ToString()))
  90. .Skip(1)
  91. .Select(x => x == 1 ? 0 : 1);
  92. var res = Convert.ToInt32(String.Join("", bytes), 2);
  93. return buffer[buffer.Length - 1] == res + 1;
  94. }
  95. public void Dispose()
  96. {
  97. this.Dispose(true);
  98. GC.SuppressFinalize(this);
  99. }
  100. protected virtual void Dispose(bool flag)
  101. {
  102. if (flag)
  103. {
  104. IDisposable disposable = this.leftBytes as IDisposable;
  105. if (disposable != null) { disposable.Dispose(); }
  106. }
  107. }
  108. }
  109. }