/// <summary> /// Load an index file /// </summary> /// <param name="file">File path</param> /// <param name="bucketIndex">Index</param> /// <exception cref="InvalidDataException">Index file is invalid</exception> private unsafe void LoadIndexFile(string file, int bucketIndex) { using (Stream stream = File.OpenRead(file)) using (BinaryReader reader = new BinaryReader(stream)) { var header = reader.Read <IndexHeaderV2>(); if (header.IndexVersion != 0x07 || header.BucketIndex != bucketIndex || header.ExtraBytes != 0x00 || header.SpanSizeBytes != 0x04 || header.SpanOffsBytes != 0x05 || header.EKeyBytes != EKey.CASC_EKEY_SIZE) { throw new InvalidDataException("invalid index header"); } var eKey1Block = reader.Read <BlockSizeAndHash>(); int entryCount = eKey1Block.BlockSize / sizeof(EKeyEntry); EKeyEntry[] entries = reader.ReadArray <EKeyEntry>(entryCount); for (int i = 0; i < entryCount; i++) { EKeyEntry entry = entries[i]; if (IndexEntries.ContainsKey(entry.EKey)) { continue; } IndexEntries[entry.EKey] = new IndexEntry(entry); } } }
public unsafe IndexEntry(EKeyEntry entry) { int indexHigh = entry.FileOffsetBE[0]; int indexLow = Int32FromPtrBE(entry.FileOffsetBE + 1); Index = indexHigh << 2 | (byte)((indexLow & 0xC0000000) >> 30); Offset = indexLow & 0x3FFFFFFF; }
/// <summary> /// Load an index file /// </summary> /// <param name="file">File path</param> /// <param name="bucketIndex">Index</param> /// <exception cref="InvalidDataException">Index file is invalid</exception> private unsafe void LoadIndexFile(string file, int bucketIndex) { using (Stream stream = File.OpenRead(file)) using (BinaryReader reader = new BinaryReader(stream)) { var header = reader.Read <IndexHeaderV2>(); if (header.IndexVersion != 0x07 || header.BucketIndex != bucketIndex || header.ExtraBytes != 0x00 || header.SpanSizeBytes != 0x04 || header.SpanOffsBytes != 0x05 || header.EKeyBytes != EKey.CASC_EKEY_SIZE) { throw new InvalidDataException("invalid index header"); } var eKey1Block = reader.Read <BlockSizeAndHash>(); int entryCount = eKey1Block.BlockSize / sizeof(EKeyEntry); EKeyEntry[] entries = reader.ReadArray <EKeyEntry>(entryCount); Dictionary <int, long> dataFileSizes = new Dictionary <int, long>(); for (int i = 0; i < entryCount; i++) { EKeyEntry entry = entries[i]; if (IndexEntries.ContainsKey(entry.EKey)) { continue; } IndexEntry indexEntry = new IndexEntry(entry); if (!dataFileSizes.TryGetValue(indexEntry.Index, out long dataFileSize)) { var path = GetDataFilePath(indexEntry.Index); if (!File.Exists(path)) { continue; } dataFileSize = new FileInfo(path).Length; dataFileSizes[indexEntry.Index] = dataFileSize; } if (indexEntry.Offset >= dataFileSize) { continue; } IndexEntries[entry.EKey] = indexEntry; } } }