public static UInt64 ReadVarInt(this BinaryReader reader, ref byte[] bytes, ref int offset) { DataDecoder.SizeAtLeast(ref bytes, offset + 1); reader.ReadExactly(bytes, offset, 1); UInt64 value = bytes[offset]; offset += 1; if (value < 0xFD) { return(value); } else if (value == 0xFD) { DataDecoder.SizeAtLeast(ref bytes, offset + 2); reader.ReadExactly(bytes, offset, 2); value = Bits.ToUInt16(bytes, offset); offset += 2; return(value); } else if (value == 0xFE) { DataDecoder.SizeAtLeast(ref bytes, offset + 4); reader.ReadExactly(bytes, offset, 4); value = Bits.ToUInt32(bytes, offset); offset += 4; return(value); } else if (value == 0xFF) { DataDecoder.SizeAtLeast(ref bytes, offset + 8); reader.ReadExactly(bytes, offset, 8); value = Bits.ToUInt64(bytes, offset); offset += 8; return(value); } else { throw new Exception(); } }