Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
BlobReader.cs
Go to the documentation of this file.
5
7
8[DebuggerDisplay("{GetDebuggerDisplay(),nq}")]
9public struct BlobReader
10{
11 internal const int InvalidCompressedInteger = int.MaxValue;
12
13 private readonly MemoryBlock _block;
14
15 private unsafe readonly byte* _endPointer;
16
17 private unsafe byte* _currentPointer;
18
19 private static readonly uint[] s_corEncodeTokenArray = new uint[4] { 33554432u, 16777216u, 452984832u, 0u };
20
21 public unsafe byte* StartPointer => _block.Pointer;
22
23 public unsafe byte* CurrentPointer => _currentPointer;
24
25 public int Length => _block.Length;
26
27 public unsafe int Offset
28 {
29 get
30 {
31 return (int)(_currentPointer - _block.Pointer);
32 }
33 set
34 {
35 if ((uint)value > (uint)_block.Length)
36 {
38 }
39 _currentPointer = _block.Pointer + value;
40 }
41 }
42
43 public unsafe int RemainingBytes => (int)(_endPointer - _currentPointer);
44
45 public unsafe BlobReader(byte* buffer, int length)
46 : this(MemoryBlock.CreateChecked(buffer, length))
47 {
48 }
49
50 internal unsafe BlobReader(MemoryBlock block)
51 {
52 _block = block;
54 _endPointer = block.Pointer + block.Length;
55 }
56
57 internal unsafe string GetDebuggerDisplay()
58 {
59 if (_block.Pointer == null)
60 {
61 return "<null>";
62 }
63 int displayedBytes;
64 string debuggerDisplay = _block.GetDebuggerDisplay(out displayedBytes);
65 if (Offset < displayedBytes)
66 {
67 return debuggerDisplay.Insert(Offset * 3, "*");
68 }
69 if (displayedBytes == _block.Length)
70 {
71 return debuggerDisplay + "*";
72 }
73 return debuggerDisplay + "*...";
74 }
75
76 public unsafe void Reset()
77 {
79 }
80
81 public void Align(byte alignment)
82 {
83 if (!TryAlign(alignment))
84 {
86 }
87 }
88
89 internal unsafe bool TryAlign(byte alignment)
90 {
91 int num = Offset & (alignment - 1);
92 if (num != 0)
93 {
94 int num2 = alignment - num;
95 if (num2 > RemainingBytes)
96 {
97 return false;
98 }
99 _currentPointer += num2;
100 }
101 return true;
102 }
103
104 internal unsafe MemoryBlock GetMemoryBlockAt(int offset, int length)
105 {
108 }
109
110 [MethodImpl(MethodImplOptions.AggressiveInlining)]
111 private unsafe void CheckBounds(int offset, int byteCount)
112 {
113 if ((ulong)((long)(uint)offset + (long)(uint)byteCount) > (ulong)(_endPointer - _currentPointer))
114 {
116 }
117 }
118
119 [MethodImpl(MethodImplOptions.AggressiveInlining)]
120 private unsafe byte* GetCurrentPointerAndAdvance(int length)
121 {
122 byte* currentPointer = _currentPointer;
123 if ((uint)length > (uint)(_endPointer - currentPointer))
124 {
126 }
127 _currentPointer = currentPointer + length;
128 return currentPointer;
129 }
130
131 [MethodImpl(MethodImplOptions.AggressiveInlining)]
132 private unsafe byte* GetCurrentPointerAndAdvance1()
133 {
134 byte* currentPointer = _currentPointer;
135 if (currentPointer == _endPointer)
136 {
138 }
139 _currentPointer = currentPointer + 1;
140 return currentPointer;
141 }
142
143 public bool ReadBoolean()
144 {
145 return ReadByte() != 0;
146 }
147
148 public unsafe sbyte ReadSByte()
149 {
150 return (sbyte)(*GetCurrentPointerAndAdvance1());
151 }
152
153 public unsafe byte ReadByte()
154 {
156 }
157
158 public unsafe char ReadChar()
159 {
160 byte* currentPointerAndAdvance = GetCurrentPointerAndAdvance(2);
161 return (char)(*currentPointerAndAdvance + (currentPointerAndAdvance[1] << 8));
162 }
163
164 public unsafe short ReadInt16()
165 {
166 byte* currentPointerAndAdvance = GetCurrentPointerAndAdvance(2);
167 return (short)(*currentPointerAndAdvance + (currentPointerAndAdvance[1] << 8));
168 }
169
170 public unsafe ushort ReadUInt16()
171 {
172 byte* currentPointerAndAdvance = GetCurrentPointerAndAdvance(2);
173 return (ushort)(*currentPointerAndAdvance + (currentPointerAndAdvance[1] << 8));
174 }
175
176 public unsafe int ReadInt32()
177 {
178 byte* currentPointerAndAdvance = GetCurrentPointerAndAdvance(4);
179 return *currentPointerAndAdvance + (currentPointerAndAdvance[1] << 8) + (currentPointerAndAdvance[2] << 16) + (currentPointerAndAdvance[3] << 24);
180 }
181
182 public unsafe uint ReadUInt32()
183 {
184 byte* currentPointerAndAdvance = GetCurrentPointerAndAdvance(4);
185 return (uint)(*currentPointerAndAdvance + (currentPointerAndAdvance[1] << 8) + (currentPointerAndAdvance[2] << 16) + (currentPointerAndAdvance[3] << 24));
186 }
187
188 public unsafe long ReadInt64()
189 {
190 byte* currentPointerAndAdvance = GetCurrentPointerAndAdvance(8);
191 uint num = (uint)(*currentPointerAndAdvance + (currentPointerAndAdvance[1] << 8) + (currentPointerAndAdvance[2] << 16) + (currentPointerAndAdvance[3] << 24));
192 uint num2 = (uint)(currentPointerAndAdvance[4] + (currentPointerAndAdvance[5] << 8) + (currentPointerAndAdvance[6] << 16) + (currentPointerAndAdvance[7] << 24));
193 return (long)(num + ((ulong)num2 << 32));
194 }
195
196 public ulong ReadUInt64()
197 {
198 return (ulong)ReadInt64();
199 }
200
201 public unsafe float ReadSingle()
202 {
203 int num = ReadInt32();
204 return *(float*)(&num);
205 }
206
207 public unsafe double ReadDouble()
208 {
209 long num = ReadInt64();
210 return *(double*)(&num);
211 }
212
213 public unsafe Guid ReadGuid()
214 {
215 byte* currentPointerAndAdvance = GetCurrentPointerAndAdvance(16);
217 {
218 return *(Guid*)currentPointerAndAdvance;
219 }
220 return new Guid(*currentPointerAndAdvance | (currentPointerAndAdvance[1] << 8) | (currentPointerAndAdvance[2] << 16) | (currentPointerAndAdvance[3] << 24), (short)(currentPointerAndAdvance[4] | (currentPointerAndAdvance[5] << 8)), (short)(currentPointerAndAdvance[6] | (currentPointerAndAdvance[7] << 8)), currentPointerAndAdvance[8], currentPointerAndAdvance[9], currentPointerAndAdvance[10], currentPointerAndAdvance[11], currentPointerAndAdvance[12], currentPointerAndAdvance[13], currentPointerAndAdvance[14], currentPointerAndAdvance[15]);
221 }
222
223 public unsafe decimal ReadDecimal()
224 {
225 byte* currentPointerAndAdvance = GetCurrentPointerAndAdvance(13);
226 byte b = (byte)(*currentPointerAndAdvance & 0x7Fu);
227 if (b > 28)
228 {
230 }
231 return new decimal(currentPointerAndAdvance[1] | (currentPointerAndAdvance[2] << 8) | (currentPointerAndAdvance[3] << 16) | (currentPointerAndAdvance[4] << 24), currentPointerAndAdvance[5] | (currentPointerAndAdvance[6] << 8) | (currentPointerAndAdvance[7] << 16) | (currentPointerAndAdvance[8] << 24), currentPointerAndAdvance[9] | (currentPointerAndAdvance[10] << 8) | (currentPointerAndAdvance[11] << 16) | (currentPointerAndAdvance[12] << 24), (*currentPointerAndAdvance & 0x80) != 0, b);
232 }
233
235 {
236 return new DateTime(ReadInt64());
237 }
238
240 {
241 return new SignatureHeader(ReadByte());
242 }
243
244 public int IndexOf(byte value)
245 {
246 int offset = Offset;
248 if (num < 0)
249 {
250 return -1;
251 }
252 return num - offset;
253 }
254
255 public unsafe string ReadUTF8(int byteCount)
256 {
257 string result = _block.PeekUtf8(Offset, byteCount);
259 return result;
260 }
261
262 public unsafe string ReadUTF16(int byteCount)
263 {
264 string result = _block.PeekUtf16(Offset, byteCount);
266 return result;
267 }
268
269 public unsafe byte[] ReadBytes(int byteCount)
270 {
271 byte[] result = _block.PeekBytes(Offset, byteCount);
273 return result;
274 }
275
276 public unsafe void ReadBytes(int byteCount, byte[] buffer, int bufferOffset)
277 {
279 }
280
281 internal unsafe string ReadUtf8NullTerminated()
282 {
283 int numberOfBytesRead;
284 string result = _block.PeekUtf8NullTerminated(Offset, null, MetadataStringDecoder.DefaultUTF8, out numberOfBytesRead);
285 _currentPointer += numberOfBytesRead;
286 return result;
287 }
288
290 {
291 int numberOfBytesRead;
292 int result = _block.PeekCompressedInteger(Offset, out numberOfBytesRead);
293 _currentPointer += numberOfBytesRead;
294 return result;
295 }
296
297 public bool TryReadCompressedInteger(out int value)
298 {
300 return value != int.MaxValue;
301 }
302
304 {
305 if (!TryReadCompressedInteger(out var value))
306 {
308 }
309 return value;
310 }
311
312 public unsafe bool TryReadCompressedSignedInteger(out int value)
313 {
314 value = _block.PeekCompressedInteger(Offset, out var numberOfBytesRead);
315 if (value == int.MaxValue)
316 {
317 return false;
318 }
319 bool flag = (value & 1) != 0;
320 value >>= 1;
321 if (flag)
322 {
323 switch (numberOfBytesRead)
324 {
325 case 1:
326 value |= -64;
327 break;
328 case 2:
329 value |= -8192;
330 break;
331 default:
332 value |= -268435456;
333 break;
334 }
335 }
336 _currentPointer += numberOfBytesRead;
337 return true;
338 }
339
341 {
343 {
345 }
346 return value;
347 }
348
350 {
352 if (num > 255)
353 {
354 return SerializationTypeCode.Invalid;
355 }
356 return (SerializationTypeCode)num;
357 }
358
360 {
362 if ((uint)(num - 17) <= 1u)
363 {
364 return SignatureTypeCode.TypeHandle;
365 }
366 if (num > 255)
367 {
368 return SignatureTypeCode.Invalid;
369 }
370 return (SignatureTypeCode)num;
371 }
372
373 public string? ReadSerializedString()
374 {
375 if (TryReadCompressedInteger(out var value))
376 {
377 return ReadUTF8(value);
378 }
379 if (ReadByte() != byte.MaxValue)
380 {
382 }
383 return null;
384 }
385
387 {
388 uint num = (uint)ReadCompressedIntegerOrInvalid();
389 uint num2 = s_corEncodeTokenArray[num & 3];
390 if (num == int.MaxValue || num2 == 0)
391 {
392 return default(EntityHandle);
393 }
394 return new EntityHandle(num2 | (num >> 2));
395 }
396
401
402 public object? ReadConstant(ConstantTypeCode typeCode)
403 {
404 switch (typeCode)
405 {
406 case ConstantTypeCode.Boolean:
407 return ReadBoolean();
408 case ConstantTypeCode.Char:
409 return ReadChar();
410 case ConstantTypeCode.SByte:
411 return ReadSByte();
412 case ConstantTypeCode.Int16:
413 return ReadInt16();
414 case ConstantTypeCode.Int32:
415 return ReadInt32();
416 case ConstantTypeCode.Int64:
417 return ReadInt64();
418 case ConstantTypeCode.Byte:
419 return ReadByte();
420 case ConstantTypeCode.UInt16:
421 return ReadUInt16();
422 case ConstantTypeCode.UInt32:
423 return ReadUInt32();
424 case ConstantTypeCode.UInt64:
425 return ReadUInt64();
426 case ConstantTypeCode.Single:
427 return ReadSingle();
428 case ConstantTypeCode.Double:
429 return ReadDouble();
430 case ConstantTypeCode.String:
432 case ConstantTypeCode.NullReference:
433 if (ReadUInt32() != 0)
434 {
436 }
437 return null;
438 default:
439 throw new ArgumentOutOfRangeException("typeCode");
440 }
441 }
442}
static readonly bool IsLittleEndian
static void InvalidSerializedString()
Definition Throw.cs:222
static void OutOfBounds()
Definition Throw.cs:187
static void InvalidCompressedInteger()
Definition Throw.cs:215
static void Copy(int[] source, int startIndex, IntPtr destination, int length)
Definition Marshal.cs:800
static string ValueTooLarge
Definition SR.cs:134
static string InvalidConstantValue
Definition SR.cs:128
Definition SR.cs:7
unsafe int IndexOfUnchecked(byte b, int start)
unsafe string PeekUtf16(int offset, int byteCount)
unsafe int PeekCompressedInteger(int offset, out int numberOfBytesRead)
unsafe byte[] PeekBytes(int offset, int byteCount)
unsafe string PeekUtf8NullTerminated(int offset, byte[]? prefix, MetadataStringDecoder utf8Decoder, out int numberOfBytesRead, char terminator='\0')
unsafe string PeekUtf8(int offset, int byteCount)
static BlobHandle FromOffset(int heapOffset)
Definition BlobHandle.cs:34
unsafe bool TryReadCompressedSignedInteger(out int value)
SignatureTypeCode ReadSignatureTypeCode()
unsafe readonly byte * _endPointer
Definition BlobReader.cs:15
object? ReadConstant(ConstantTypeCode typeCode)
static readonly uint[] s_corEncodeTokenArray
Definition BlobReader.cs:19
unsafe BlobReader(byte *buffer, int length)
Definition BlobReader.cs:45
unsafe byte * GetCurrentPointerAndAdvance(int length)
unsafe string ReadUTF16(int byteCount)
unsafe BlobReader(MemoryBlock block)
Definition BlobReader.cs:50
unsafe string ReadUTF8(int byteCount)
bool TryReadCompressedInteger(out int value)
unsafe void CheckBounds(int offset, int byteCount)
unsafe void ReadBytes(int byteCount, byte[] buffer, int bufferOffset)
SerializationTypeCode ReadSerializationTypeCode()
unsafe bool TryAlign(byte alignment)
Definition BlobReader.cs:89
unsafe byte[] ReadBytes(int byteCount)
unsafe MemoryBlock GetMemoryBlockAt(int offset, int length)