/// <summary> /// 数据取出后就从当前列表中移除 /// </summary> /// <param name="len"></param> /// <returns></returns> public byte[] getBytes(int len) { if (available() < len) { return(null); } if (Count < 1) { return(null); } byte[] data = new byte[len]; int offset = 0; while (offset < data.Length) { ArraySegment <byte> seg = this[0]; if (offset + seg.Count > len) { Buffer.BlockCopy(seg.Array, seg.Offset, data, offset, len - offset); updateOffset(seg.Offset + (len - offset)); return(data); } else { Buffer.BlockCopy(seg.Array, seg.Offset, data, offset, seg.Count); offset += seg.Count; this.RemoveAt(0); //回收seg( 如果是规范内的buf长度 128b/256b/512b/1024b/...) //如果不是通过 ByteListPoolMgr.FreeBuf(seg.Array); } } // UnityEngine.Debug.Log("EXIT LOOP????!??!?!?!?? "); return(data); }
protected void Dispose(bool Disposing) { if (m_IsDispose) { return; } m_IsDispose = true; if (Disposing) { //主动释放,则回收 for (int i = this.Count - 1; i >= 0; i--) { ByteListPoolMgr.FreeBuf(this[i].Array); } base.Clear(); } }
/// <summary> /// 数据取出后就从当前列表中移除 /// </summary> /// <param name="fill2Data">填充数组,外面保证其剩余长度有效性</param> /// <param name="fill2BuffOffset"></param> /// <param name="len">外面保证取长度的有效性</param> public void getBytes(ref byte[] fill2Data, int fill2BuffOffset, int len) { if (available() < len) { return; } if (fill2Data.Length - fill2BuffOffset < len) { return; } if (Count < 1) { return; } //填充到数组 int offset = 0; while (offset < len) { ArraySegment <byte> seg = this[0]; if (offset + seg.Count > len) { Buffer.BlockCopy(seg.Array, seg.Offset, fill2Data, offset + fill2BuffOffset, len - offset); updateOffset(seg.Offset + (len - offset)); break; } else { Buffer.BlockCopy(seg.Array, seg.Offset, fill2Data, offset + fill2BuffOffset, seg.Count); offset += seg.Count; this.RemoveAt(0); //回收seg 如果不是通过ByteListPoolMgr申请的byte[] 并且长度不是64偶数倍(最大64)的数据将直接丢弃,由GC回收 ByteListPoolMgr.FreeBuf(seg.Array); } } }