public static byte[] AppendBytes(byte[] value, ProtoReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } WireType wireType = reader.wireType; if (wireType == WireType.String) { int num = (int)reader.ReadUInt32Variant(trimNegative: false); reader.wireType = WireType.None; if (num == 0) { if (value != null) { return(value); } return(EmptyBlob); } int num2; if (value == null || value.Length == 0) { num2 = 0; value = new byte[num]; } else { num2 = value.Length; byte[] array = new byte[value.Length + num]; Helpers.BlockCopy(value, 0, array, 0, value.Length); value = array; } reader.position += num; while (num > reader.available) { if (reader.available > 0) { Helpers.BlockCopy(reader.ioBuffer, reader.ioIndex, value, num2, reader.available); num -= reader.available; num2 += reader.available; reader.ioIndex = (reader.available = 0); } int num3 = (num > reader.ioBuffer.Length) ? reader.ioBuffer.Length : num; if (num3 > 0) { reader.Ensure(num3, strict: true); } } if (num > 0) { Helpers.BlockCopy(reader.ioBuffer, reader.ioIndex, value, num2, num); reader.ioIndex += num; reader.available -= num; } return(value); } throw reader.CreateWireTypeException(); }
/// <summary> /// Reads a byte-sequence from the stream, appending them to an existing byte-sequence (which can be null); supported wire-types: String /// </summary> public static byte[] AppendBytes(byte[] value, ProtoReader reader) { switch (reader.wireType) { case WireType.String: int len = (int)reader.ReadUInt32Variant(false); reader.wireType = WireType.None; if (len == 0) { return(value); } int offset; if (value == null || value.Length == 0) { offset = 0; value = new byte[len]; } else { offset = value.Length; byte[] tmp = new byte[value.Length + len]; Helpers.BlockCopy(value, 0, tmp, 0, value.Length); value = tmp; } // value is now sized with the final length, and (if necessary) // contains the old data up to "offset" reader.position += len; // assume success while (len > reader.available) { if (reader.available > 0) { // copy what we *do* have Helpers.BlockCopy(reader.ioBuffer, reader.ioIndex, value, offset, reader.available); len -= reader.available; offset += reader.available; reader.ioIndex = reader.available = 0; // we've drained the buffer } // now refill the buffer (without overflowing it) int count = len > reader.ioBuffer.Length ? reader.ioBuffer.Length : len; if (count > 0) { reader.Ensure(count, true); } } // at this point, we know that len <= available if (len > 0) { // still need data, but we have enough buffered Helpers.BlockCopy(reader.ioBuffer, reader.ioIndex, value, offset, len); reader.ioIndex += len; reader.available -= len; } return(value); default: throw reader.CreateException(); } }
public static byte[] AppendBytes(byte[] value, ProtoReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } WireType wireType = reader.wireType; if (wireType != WireType.String) { throw reader.CreateWireTypeException(); } int i = (int)reader.ReadUInt32Variant(false); reader.wireType = WireType.None; if (i == 0) { return((value != null) ? value : ProtoReader.EmptyBlob); } int num; if (value == null || value.Length == 0) { num = 0; value = new byte[i]; } else { num = value.Length; byte[] array = new byte[value.Length + i]; Helpers.BlockCopy(value, 0, array, 0, value.Length); value = array; } reader.position += i; while (i > reader.available) { if (reader.available > 0) { Helpers.BlockCopy(reader.ioBuffer, reader.ioIndex, value, num, reader.available); i -= reader.available; num += reader.available; reader.ioIndex = (reader.available = 0); } int num2 = (i <= reader.ioBuffer.Length) ? i : reader.ioBuffer.Length; if (num2 > 0) { reader.Ensure(num2, true); } } if (i > 0) { Helpers.BlockCopy(reader.ioBuffer, reader.ioIndex, value, num, i); reader.ioIndex += i; reader.available -= i; } return(value); }
/// <summary> /// Reads a byte-sequence from the stream, appending them to an existing byte-sequence (which can be null); supported wire-types: String /// </summary> public static byte[] AppendBytes(byte[] value, ProtoReader reader) { switch (reader.wireType) { case WireType.String: int len = (int)reader.ReadUInt32Variant(false); reader.wireType = WireType.None; if (len == 0) return value; int offset; if(value == null || value.Length == 0) { offset = 0; value = new byte[len]; } else { offset = value.Length; byte[] tmp = new byte[value.Length + len]; Helpers.BlockCopy(value, 0, tmp, 0, value.Length); value = tmp; } // value is now sized with the final length, and (if necessary) // contains the old data up to "offset" reader.position += len; // assume success while (len > reader.available) { if (reader.available > 0) { // copy what we *do* have Helpers.BlockCopy(reader.ioBuffer, reader.ioIndex, value, offset, reader.available); len -= reader.available; offset += reader.available; reader.ioIndex = reader.available = 0; // we've drained the buffer } // now refill the buffer (without overflowing it) int count = len > reader.ioBuffer.Length ? reader.ioBuffer.Length : len; if (count > 0) reader.Ensure(count, true); } // at this point, we know that len <= available if (len > 0) { // still need data, but we have enough buffered Helpers.BlockCopy(reader.ioBuffer, reader.ioIndex, value, offset, len); reader.ioIndex += len; reader.available -= len; } return value; default: throw reader.CreateException(); } }
public static byte[] AppendBytes(byte[] value, ProtoReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } WireType wireType = reader.wireType; if (wireType != WireType.String) { throw reader.CreateWireTypeException(); } int i = (int)reader.ReadUInt32Variant(false); reader.wireType = WireType.None; if (i == 0) { return (value != null) ? value : ProtoReader.EmptyBlob; } int num; if (value == null || value.Length == 0) { num = 0; value = new byte[i]; } else { num = value.Length; byte[] array = new byte[value.Length + i]; Helpers.BlockCopy(value, 0, array, 0, value.Length); value = array; } reader.position += i; while (i > reader.available) { if (reader.available > 0) { Helpers.BlockCopy(reader.ioBuffer, reader.ioIndex, value, num, reader.available); i -= reader.available; num += reader.available; reader.ioIndex = (reader.available = 0); } int num2 = (i <= reader.ioBuffer.Length) ? i : reader.ioBuffer.Length; if (num2 > 0) { reader.Ensure(num2, true); } } if (i > 0) { Helpers.BlockCopy(reader.ioBuffer, reader.ioIndex, value, num, i); reader.ioIndex += i; reader.available -= i; } return value; }