/// <summary> /// Fix data offsets. Values in packfile not always valid. /// Ignores packfiles that are compressed AND condensed since those must /// be fully extracted and data offsets aren't relevant in that case. /// </summary> private void FixEntryDataOffsets() { if (Header.Compressed && Header.Condensed) { return; } long runningDataOffset = 0; //Track relative offset from data section start foreach (var entry in DirectoryEntries) { //Set entry offset entry.DataOffset = runningDataOffset; //Update offset based on entry size and storage type if (Header.Compressed) //Compressed, not condensed { if (runningDataOffset + entry.CompressedDataSize > uint.MaxValue) { runningDataOffset += entry.CompressedDataSize; } else { runningDataOffset += entry.CompressedDataSize; } long alignmentPad = BinaryHelpers.GetAlignmentPad(runningDataOffset); if (runningDataOffset + alignmentPad > uint.MaxValue) { runningDataOffset += alignmentPad; } else { runningDataOffset += alignmentPad; } } else //Not compressed, maybe condensed { if (runningDataOffset + entry.DataSize > uint.MaxValue) { runningDataOffset += entry.DataSize; } else { runningDataOffset += entry.DataSize; } if (!Header.Condensed) { long alignmentPad = BinaryHelpers.GetAlignmentPad(runningDataOffset); if (runningDataOffset + alignmentPad > uint.MaxValue) { runningDataOffset += BinaryHelpers.GetAlignmentPad(runningDataOffset); } else { runningDataOffset += BinaryHelpers.GetAlignmentPad(runningDataOffset); } } } } }