internal void DecodePartition(byte[] buffer) { #if ENABLE_LOCAL_BYTE_IO_ACCESS List <LocalByteArray> partitions = new List <LocalByteArray>(); LocalByteArray tmp_Crt = new LocalByteArray(); #else List <byte[]> partitions = new List <byte[]>(); List <byte> tmp_Crt = new List <byte>(); #endif for (int pos = 0; pos < buffer.Length; pos++) { byte by = buffer[pos]; // end of stream if (pos == buffer.Length - 1) { partitions.Add(tmp_Crt.ToArray()); break; } if (by == 255) { // partition divisor partitions.Add(tmp_Crt.ToArray()); #if ENABLE_LOCAL_BYTE_IO_ACCESS tmp_Crt.Dispose(); tmp_Crt = new LocalByteArray(); #else tmp_Crt.Clear(); tmp_Crt = new List <byte>(); #endif #if USE_OPTIMIZATIONS GC.Collect(); GC.WaitForPendingFinalizers(); // wait for memory clear #endif continue; } else { byte n = Format128UnsignedTo255Byte(by); tmp_Crt.Add(n); continue; } } #if ENABLE_LOCAL_BYTE_IO_ACCESS foreach (byte[] tmp in partitions) { this.PartitionsDecoded.Add(tmp); } #else this.PartitionsDecoded.AddRange(partitions); #endif #if ENABLE_LOCAL_BYTE_IO_ACCESS foreach (LocalByteArray n in partitions) { n.Dispose(); } partitions.Clear(); tmp_Crt.Dispose(); #else partitions.Clear(); partitions = null; tmp_Crt.Clear(); tmp_Crt = null; #endif GC.Collect(); }