电子药箱通讯服务端
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

ElectronicMedicineKitMarshalEndian.cs 3.7KB

před 7 měsíci
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace Rdh.SocketServer.Client.Models
  5. {
  6. public class ElectronicMedicineKitMarshalEndian
  7. {
  8. private readonly int ConstLength = 11; //最小包长
  9. private List<byte> leftBytes = new List<byte>(); //历史遗留包数据
  10. public List<ElectronicMedicineKitBetweenAndRequestInfo> GetSendSockets(byte[] buffer, int len)
  11. {
  12. //拷贝当前有效数据
  13. var bytes = new byte[len];
  14. Buffer.BlockCopy(buffer, 0, bytes, 0, len);
  15. //合并上个包的遗留数据
  16. if (leftBytes.Count > 0)
  17. {
  18. leftBytes.AddRange(bytes);
  19. bytes = leftBytes.ToArray();
  20. leftBytes.Clear();
  21. leftBytes = new List<byte>();
  22. }
  23. var sendSockets = new List<ElectronicMedicineKitBetweenAndRequestInfo>();
  24. while (bytes.Length > 0 || leftBytes.Count > 0)
  25. {
  26. if (bytes.Length < ConstLength)
  27. {
  28. leftBytes.AddRange(bytes);
  29. return sendSockets;
  30. }
  31. //寻找head1的索引
  32. var isFind = false;
  33. var headIndex = 0;
  34. while (headIndex < bytes.Length)
  35. {
  36. //if (bytes[headIndex] == head1 && bytes[headIndex + 1] == head2 && bytes[headIndex + 2] == head3)
  37. //{
  38. // isFind = true;
  39. // break;
  40. //}
  41. if (bytes.Skip(headIndex).Take(ElectronicMedicineKitBetweenAndRequestInfo.Header.Length).SequenceEqual(ElectronicMedicineKitBetweenAndRequestInfo.Header))
  42. {
  43. isFind = true;
  44. break;
  45. }
  46. headIndex++;
  47. isFind = false;
  48. }
  49. if (!isFind)
  50. {
  51. leftBytes.AddRange(bytes);
  52. return sendSockets;
  53. }
  54. //寻找foot1的索引
  55. var footIndex = headIndex;
  56. while (footIndex < bytes.Length)
  57. {
  58. //if (bytes[footIndex] == foot1 && bytes[footIndex + 1] == foot2 && bytes[footIndex + 2] == foot3)
  59. //{
  60. // isFind = true;
  61. // break;
  62. //}
  63. if (bytes.Skip(footIndex).Take(ElectronicMedicineKitBetweenAndRequestInfo.Footer.Length).SequenceEqual(ElectronicMedicineKitBetweenAndRequestInfo.Footer))
  64. {
  65. isFind = true;
  66. break;
  67. }
  68. footIndex++;
  69. isFind = false;
  70. }
  71. if (!isFind || (footIndex - headIndex + ElectronicMedicineKitBetweenAndRequestInfo.Footer.Length) < ConstLength)
  72. {
  73. leftBytes.AddRange(bytes);
  74. return sendSockets;
  75. }
  76. //提取一个完整包数据 并解析
  77. var packBuffer = bytes.Skip(headIndex).Take(footIndex + ElectronicMedicineKitBetweenAndRequestInfo.Footer.Length).ToArray();
  78. var domain = new ElectronicMedicineKitBetweenAndRequestInfo();
  79. domain.OnParsingBody(packBuffer.Skip(ElectronicMedicineKitBetweenAndRequestInfo.Header.Length).SkipLast(ElectronicMedicineKitBetweenAndRequestInfo.Footer.Length).ToArray());
  80. sendSockets.Add(domain);
  81. bytes = bytes.Skip(packBuffer.Length).ToArray();
  82. }
  83. return sendSockets;
  84. }
  85. }
  86. }