public void HoldFor(byte[] src, uint offset, uint size, uint needed) { lock (syncLock) { if (size >= needed) { throw new Exception("Size >= Needed !"); } //trim = true; data = DC.Combine(src, offset, size, data, 0, (uint)data.Length); neededDataLength = needed; // Console.WriteLine("Hold StackTrace: '{0}'", Environment.StackTrace); //Console.WriteLine("Holded {0} {1} {2} {3} - {4}", offset, size, needed, data.Length, GetHashCode()); } }
public static byte[] Compose(TransmissionTypeIdentifier identifier, byte[] data) { if (data == null || data.Length == 0) { return new byte[] { (byte)identifier } } ; var cls = (TransmissionTypeClass)((int)identifier >> 6); if (cls == TransmissionTypeClass.Fixed) { return(DC.Combine(new byte[] { (byte)identifier }, 0, 1, data, 0, (uint)data.Length)); } else { var len = (ulong)data.LongLength; if (len == 0) { return(new byte[1] { (byte)identifier }); } else if (len <= 0xFF) { var rt = new byte[2 + len]; rt[0] = (byte)((byte)identifier | 0x8); rt[1] = (byte)len; Buffer.BlockCopy(data, 0, rt, 2, (int)len); return(rt); } else if (len <= 0xFF_FF) { var rt = new byte[3 + len]; rt[0] = (byte)((byte)identifier | 0x10); rt[1] = (byte)((len >> 8) & 0xFF); rt[2] = (byte)(len & 0xFF); Buffer.BlockCopy(data, 0, rt, 3, (int)len); return(rt); } else if (len <= 0xFF_FF_FF) { var rt = new byte[4 + len]; rt[0] = (byte)((byte)identifier | 0x18); rt[1] = (byte)((len >> 16) & 0xFF); rt[2] = (byte)((len >> 8) & 0xFF); rt[3] = (byte)(len & 0xFF); Buffer.BlockCopy(data, 0, rt, 4, (int)len); return(rt); } else if (len <= 0xFF_FF_FF_FF) { var rt = new byte[5 + len]; rt[0] = (byte)((byte)identifier | 0x20); rt[1] = (byte)((len >> 24) & 0xFF); rt[2] = (byte)((len >> 16) & 0xFF); rt[3] = (byte)((len >> 8) & 0xFF); rt[4] = (byte)(len & 0xFF); Buffer.BlockCopy(data, 0, rt, 5, (int)len); return(rt); } else if (len <= 0xFF_FF_FF_FF_FF) { var rt = new byte[6 + len]; rt[0] = (byte)((byte)identifier | 0x28); rt[1] = (byte)((len >> 32) & 0xFF); rt[2] = (byte)((len >> 24) & 0xFF); rt[3] = (byte)((len >> 16) & 0xFF); rt[4] = (byte)((len >> 8) & 0xFF); rt[5] = (byte)(len & 0xFF); Buffer.BlockCopy(data, 0, rt, 6, (int)len); return(rt); } else if (len <= 0xFF_FF_FF_FF_FF_FF) { var rt = new byte[7 + len]; rt[0] = (byte)((byte)identifier | 0x30); rt[1] = (byte)((len >> 40) & 0xFF); rt[2] = (byte)((len >> 32) & 0xFF); rt[3] = (byte)((len >> 24) & 0xFF); rt[4] = (byte)((len >> 16) & 0xFF); rt[5] = (byte)((len >> 8) & 0xFF); rt[6] = (byte)(len & 0xFF); Buffer.BlockCopy(data, 0, rt, 7, (int)len); return(rt); } else //if (len <= 0xFF_FF_FF_FF_FF_FF_FF) { var rt = new byte[8 + len]; rt[0] = (byte)((byte)identifier | 0x38); rt[1] = (byte)((len >> 48) & 0xFF); rt[2] = (byte)((len >> 40) & 0xFF); rt[3] = (byte)((len >> 32) & 0xFF); rt[4] = (byte)((len >> 24) & 0xFF); rt[5] = (byte)((len >> 16) & 0xFF); rt[6] = (byte)((len >> 8) & 0xFF); rt[7] = (byte)(len & 0xFF); Buffer.BlockCopy(data, 0, rt, 8, (int)len); return(rt); } //else // if (len <= 0xFF_FF_FF_FF_FF_FF_FF_FF) //{ // var rt = new byte[9 + len]; // rt[0] = (byte)((byte)identifier | 0x8); // rt[1] = (byte)((len >> 56) & 0xFF); // rt[2] = (byte)((len >> 48) & 0xFF); // rt[3] = (byte)((len >> 40) & 0xFF); // rt[4] = (byte)((len >> 32) & 0xFF); // rt[5] = (byte)((len >> 24) & 0xFF); // rt[6] = (byte)((len >> 16) & 0xFF); // rt[7] = (byte)((len >> 8) & 0xFF); // rt[8] = (byte)(len & 0xFF); // Buffer.BlockCopy(data, 0, rt, 9, (int)len); // return rt; //} // // add length // int bytes = 1; //for (var i = 56; i > 0; i -= 8, bytes++) // if (len <= (0xFF_FF_FF_FF_FF_FF_FF_FF >> i)) // break; //var rt = new byte[1 + bytes + data.Length]; //rt[0] = (byte)((byte)identifier | (bytes << 3)); //for (var i = 1; i <= bytes; i++) // rt[i] = data.LongLength >> i * 8; //Buffer.BlockCopy(data, 0, rt, 1 + bytes, data.Length); } }