void init() { var streamTable = metadata.getStream("#~") ?? metadata.getStream("#-"); if (streamTable == null) { throw new ApplicationException("Could not find #~ stream"); } seek(streamTable.Offset); reader.ReadUInt32(); // reserved reader.ReadUInt16(); // major + minor version heapOffsetSizes = reader.ReadByte(); reader.ReadByte(); // always 1 ulong validMask = reader.ReadUInt64(); reader.ReadUInt64(); // sorted var numRows = new uint[64]; for (int i = 0; validMask != 0; i++, validMask >>= 1) { if ((validMask & 1) != 0) { numRows[i] = reader.ReadUInt32(); } } var builder = new MetadataTypeBuilder(heapOffsetSizes, numRows); uint fileOffset = (uint)reader.BaseStream.Position; for (int i = 0, j = 0; ; i++) { if (metadataVarType[i] == MVT.end) { var mdType = builder.create(); mdType.rows = numRows[j]; mdType.fileOffset = fileOffset; fileOffset += mdType.rows * mdType.totalSize; metadataTypes[j++] = mdType; } else if (metadataVarType[i] == MVT.stop) { break; } else { builder.field(metadataVarType[i]); } } }
void init() { var streamTable = metadata.getStream("#~") ?? metadata.getStream("#-"); if (streamTable == null) throw new ApplicationException("Could not find #~ stream"); seek(streamTable.Offset); reader.ReadUInt32(); // reserved reader.ReadUInt16(); // major + minor version heapOffsetSizes = reader.ReadByte(); reader.ReadByte(); // always 1 ulong validMask = reader.ReadUInt64(); reader.ReadUInt64(); // sorted var numRows = new uint[64]; for (int i = 0; validMask != 0; i++, validMask >>= 1) { if ((validMask & 1) != 0) numRows[i] = reader.ReadUInt32(); } var builder = new MetadataTypeBuilder(heapOffsetSizes, numRows); uint fileOffset = (uint)reader.BaseStream.Position; for (int i = 0, j = 0; ; i++) { if (metadataVarType[i] == MVT.end) { var mdType = builder.create(); mdType.rows = numRows[j]; mdType.fileOffset = fileOffset; fileOffset += mdType.rows * mdType.totalSize; metadataTypes[j++] = mdType; } else if (metadataVarType[i] == MVT.stop) break; else builder.field(metadataVarType[i]); } }