42 internal static ByteBuffer Wrap(
byte[] buf,
int length)
57 buffer =
new byte[initialCapacity];
76 if (value > Length || value > buffer.Length)
77 throw new ArgumentOutOfRangeException();
79 __length = Math.Max(__length, pos);
86 get {
return Math.Max(pos, __length); }
94 internal void Insert(
int count)
99 var free = buffer.Length - len;
103 Buffer.BlockCopy(buffer, pos, buffer, pos + count, len - pos);
104 __length = Math.Max(__length, pos) + count;
108 throw new ArgumentOutOfRangeException(
"count");
112 void Grow(
int minGrow)
114 var newbuf =
new byte[Math.Max(buffer.Length + minGrow, buffer.Length * 2)];
115 Buffer.BlockCopy(buffer, 0, newbuf, 0, buffer.Length);
126 internal int GetInt32AtCurrentPosition()
129 + (buffer[pos + 1] << 8)
130 + (buffer[pos + 2] << 16)
131 + (buffer[pos + 3] << 24);
141 internal byte GetByteAtCurrentPosition()
150 internal int GetCompressedUIntLength()
152 return (buffer[pos] & 0xC0)
switch
160 internal void Write(
byte[] value)
162 if (pos + value.Length > buffer.Length)
165 Buffer.BlockCopy(value, 0, buffer, pos, value.Length);
169 internal void Write(
byte value)
171 if (pos == buffer.Length)
173 buffer[pos++] = value;
176 internal void Write(sbyte value)
181 internal void Write(ushort value)
186 internal void Write(
short value)
188 if (pos + 2 > buffer.Length)
191 buffer[pos++] = (byte)value;
192 buffer[pos++] = (byte)(value >> 8);
195 internal void Write(uint value)
200 internal void Write(
int value)
202 if (pos + 4 > buffer.Length)
205 buffer[pos++] = (byte)value;
206 buffer[pos++] = (byte)(value >> 8);
207 buffer[pos++] = (byte)(value >> 16);
208 buffer[pos++] = (byte)(value >> 24);
211 internal void Write(ulong value)
216 internal void Write(
long value)
218 if (pos + 8 > buffer.Length)
220 buffer[pos++] = (byte)value;
221 buffer[pos++] = (byte)(value >> 8);
222 buffer[pos++] = (byte)(value >> 16);
223 buffer[pos++] = (byte)(value >> 24);
224 buffer[pos++] = (byte)(value >> 32);
225 buffer[pos++] = (byte)(value >> 40);
226 buffer[pos++] = (byte)(value >> 48);
227 buffer[pos++] = (byte)(value >> 56);
230 internal void Write(
float value)
235 internal void Write(
double value)
237 Write(BitConverter.DoubleToInt64Bits(value));
240 internal void Write(
string str)
248 var buf = Encoding.UTF8.GetBytes(str);
249 WriteCompressedUInt(buf.Length);
254 internal void WriteCompressedUInt(
int value)
260 else if (value <= 0x3FFF)
262 Write((
byte)(0x80 | (value >> 8)));
267 Write((
byte)(0xC0 | (value >> 24)));
268 Write((
byte)(value >> 16));
269 Write((
byte)(value >> 8));
274 internal void WriteCompressedInt(
int value)
278 WriteCompressedUInt(value << 1);
280 else if (value >= -64)
282 value = ((value << 1) & 0x7F) | 1;
285 else if (value >= -8192)
287 value = ((value << 1) & 0x3FFF) | 1;
288 Write((
byte)(0x80 | (value >> 8)));
293 value = ((value << 1) & 0x1FFFFFFF) | 1;
294 Write((
byte)(0xC0 | (value >> 24)));
295 Write((
byte)(value >> 16));
296 Write((
byte)(value >> 8));
303 if (pos + bb.Length > buffer.Length)
306 Buffer.BlockCopy(bb.buffer, 0, buffer, pos, bb.Length);
314 internal void Write(BlobBuilder blobBuilder)
316 Write(blobBuilder.GetBlobs());
323 internal void Write(IEnumerable<Blob> blobs)
325 foreach (var blob
in blobs)
326 Write(blob.GetBytes());
333 internal void Write(ArraySegment<byte> bytes)
335 Write(bytes.AsSpan());
342 internal void Write(ReadOnlySpan<byte> span)
345 if (pos + span.Length > buffer.Length)
349 span.CopyTo(buffer.AsSpan().Slice(pos, span.Length));
353 internal void WriteTo(
System.IO.Stream stream)
355 stream.Write(buffer, 0, this.Length);
358 internal void Clear()
364 internal void Align(
int alignment)
366 if (pos + alignment > buffer.Length)
368 int newpos = (pos + alignment - 1) & ~(alignment - 1);
373 internal void WriteTypeDefOrRefEncoded(
int token)
378 WriteCompressedUInt((token & 0xFFFFFF) << 2 | 0);
381 WriteCompressedUInt((token & 0xFFFFFF) << 2 | 1);
384 WriteCompressedUInt((token & 0xFFFFFF) << 2 | 2);
387 throw new InvalidOperationException();
391 internal byte[] ToArray()
394 var buf =
new byte[len];
395 Buffer.BlockCopy(buffer, 0, buf, 0, len);
399 internal bool Match(
int pos,
ByteBuffer bb2,
int pos2,
int len)
401 for (
int i = 0; i < len; i++)
402 if (buffer[pos + i] != bb2.buffer[pos2 + i])
412 for (
int i = 0; i < len; i++)