No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

59 líneas
2.6 KiB

  1. using JT1078.Protocol.Enums;
  2. using System;
  3. using System.Linq;
  4. using System.Collections.Concurrent;
  5. using System.Collections.Generic;
  6. using System.Text;
  7. namespace JT1078.Protocol
  8. {
  9. public static class JT1078Demuxer
  10. {
  11. private readonly static ConcurrentDictionary<string, JT1078Package> JT1078PackageGroupDict = new ConcurrentDictionary<string, JT1078Package>(StringComparer.OrdinalIgnoreCase);
  12. public static JT1078Package Demuxer(JT1078Package jT1078Package)
  13. {
  14. string cacheKey = jT1078Package.GetKey();
  15. if (jT1078Package.Label3.SubpackageType == JT1078SubPackageType.分包处理时的第一个包)
  16. {
  17. JT1078PackageGroupDict.TryRemove(cacheKey, out _);
  18. JT1078PackageGroupDict.TryAdd(cacheKey, jT1078Package);
  19. return default;
  20. }
  21. else if (jT1078Package.Label3.SubpackageType == JT1078SubPackageType.分包处理时的中间包)
  22. {
  23. if (JT1078PackageGroupDict.TryGetValue(cacheKey, out var tmpPackage))
  24. {
  25. var totalLength = tmpPackage.Bodies.Length + jT1078Package.Bodies.Length;
  26. byte[] poolBytes = JT1078ArrayPool.Rent(totalLength);
  27. Span<byte> tmpSpan = poolBytes;
  28. tmpPackage.Bodies.CopyTo(tmpSpan);
  29. jT1078Package.Bodies.CopyTo(tmpSpan.Slice(tmpPackage.Bodies.Length));
  30. tmpPackage.Bodies= tmpSpan.Slice(0, totalLength).ToArray();
  31. JT1078ArrayPool.Return(poolBytes);
  32. JT1078PackageGroupDict[cacheKey] = jT1078Package;
  33. }
  34. return default;
  35. }
  36. else if (jT1078Package.Label3.SubpackageType == JT1078SubPackageType.分包处理时的最后一个包)
  37. {
  38. if(JT1078PackageGroupDict.TryRemove(cacheKey, out var tmpPackage))
  39. {
  40. var totalLength = tmpPackage.Bodies.Length + jT1078Package.Bodies.Length;
  41. byte[] poolBytes = JT1078ArrayPool.Rent(totalLength);
  42. Span<byte> tmpSpan = poolBytes;
  43. tmpPackage.Bodies.CopyTo(tmpSpan);
  44. jT1078Package.Bodies.CopyTo(tmpSpan.Slice(tmpPackage.Bodies.Length));
  45. tmpPackage.Bodies = tmpSpan.Slice(0, totalLength).ToArray();
  46. JT1078ArrayPool.Return(poolBytes);
  47. return tmpPackage;
  48. }
  49. return default;
  50. }
  51. else
  52. {
  53. return jT1078Package;
  54. }
  55. }
  56. }
  57. }