35 readonly
byte[] buffer;
45 internal ByteReader(
byte[] buffer,
int offset,
int length)
49 this.end = pos + length;
52 internal static ByteReader FromBlob(
byte[] blobHeap, BlobHandle blob)
54 var br =
new ByteReader(blobHeap, MetadataTokens.GetHeapOffset(blob), 4);
55 var length = br.ReadCompressedUInt();
56 br.end = br.pos + length;
62 get {
return end - pos; }
65 internal byte PeekByte()
68 throw new BadImageFormatException();
73 internal byte ReadByte()
76 throw new BadImageFormatException();
81 internal byte[] ReadBytes(
int count)
84 throw new BadImageFormatException();
85 if (end - pos < count)
86 throw new BadImageFormatException();
88 var buf =
new byte[count];
89 Buffer.BlockCopy(buffer, pos, buf, 0, count);
94 internal int ReadCompressedUInt()
101 else if ((b1 & 0xC0) == 0x80)
104 return ((b1 & 0x3F) << 8) | b2;
111 return ((b1 & 0x3F) << 24) + (b2 << 16) + (b3 << 8) + b4;
115 internal int ReadCompressedInt()
118 var value = ReadCompressedUInt();
119 if ((value & 1) == 0)
125 return (b1 & 0xC0)
switch
127 0 or 0x40 => (value >> 1) - 0x40,
128 0x80 => (value >> 1) - 0x2000,
129 _ => (value >> 1) - 0x10000000,
134 internal string ReadString()
136 if (PeekByte() == 0xFF)
142 var length = ReadCompressedUInt();
143 var str = Encoding.UTF8.GetString(buffer, pos, length);
148 internal char ReadChar()
150 return (
char)ReadInt16();
153 internal sbyte ReadSByte()
155 return (sbyte)ReadByte();
158 internal short ReadInt16()
161 throw new BadImageFormatException();
163 var b1 = buffer[pos++];
164 var b2 = buffer[pos++];
165 return (
short)(b1 | (b2 << 8));
168 internal ushort ReadUInt16()
170 return (ushort)ReadInt16();
173 internal int ReadInt32()
176 throw new BadImageFormatException();
178 var b1 = buffer[pos++];
179 var b2 = buffer[pos++];
180 var b3 = buffer[pos++];
181 var b4 = buffer[pos++];
182 return (
int)(b1 | (b2 << 8) | (b3 << 16) | (b4 << 24));
185 internal uint ReadUInt32()
187 return (uint)ReadInt32();
190 internal long ReadInt64()
192 ulong lo = ReadUInt32();
193 ulong hi = ReadUInt32();
194 return (
long)(lo | (hi << 32));
197 internal ulong ReadUInt64()
199 return (ulong)ReadInt64();
202 internal float ReadSingle()
207 internal double ReadDouble()
209 return BitConverter.Int64BitsToDouble(ReadInt64());
214 if (end - pos < length)
215 throw new BadImageFormatException();
223 internal void Align(
int alignment)
226 pos = (pos + alignment) & ~alignment;