using JT1078.Protocol.Enums; using System; using System.Linq; using System.Collections.Concurrent; using System.Collections.Generic; using System.Text; namespace JT1078.Protocol { public static class JT1078Demuxer { private readonly static ConcurrentDictionary JT1078PackageGroupDict = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); public static JT1078Package Demuxer(JT1078Package jT1078Package) { string cacheKey = jT1078Package.GetKey(); if (jT1078Package.Label3.SubpackageType == JT1078SubPackageType.分包处理时的第一个包) { JT1078PackageGroupDict.TryRemove(cacheKey, out _); JT1078PackageGroupDict.TryAdd(cacheKey, jT1078Package); return default; } else if (jT1078Package.Label3.SubpackageType == JT1078SubPackageType.分包处理时的中间包) { if (JT1078PackageGroupDict.TryGetValue(cacheKey, out var tmpPackage)) { var totalLength = tmpPackage.Bodies.Length + jT1078Package.Bodies.Length; byte[] poolBytes = JT1078ArrayPool.Rent(totalLength); Span tmpSpan = poolBytes; tmpPackage.Bodies.CopyTo(tmpSpan); jT1078Package.Bodies.CopyTo(tmpSpan.Slice(tmpPackage.Bodies.Length)); tmpPackage.Bodies= tmpSpan.Slice(0, totalLength).ToArray(); JT1078ArrayPool.Return(poolBytes); JT1078PackageGroupDict[cacheKey] = jT1078Package; } return default; } else if (jT1078Package.Label3.SubpackageType == JT1078SubPackageType.分包处理时的最后一个包) { if(JT1078PackageGroupDict.TryRemove(cacheKey, out var tmpPackage)) { var totalLength = tmpPackage.Bodies.Length + jT1078Package.Bodies.Length; byte[] poolBytes = JT1078ArrayPool.Rent(totalLength); Span tmpSpan = poolBytes; tmpPackage.Bodies.CopyTo(tmpSpan); jT1078Package.Bodies.CopyTo(tmpSpan.Slice(tmpPackage.Bodies.Length)); tmpPackage.Bodies = tmpSpan.Slice(0, totalLength).ToArray(); JT1078ArrayPool.Return(poolBytes); return tmpPackage; } return default; } else { return jT1078Package; } } } }