private FolderRecord[] LoadFolderRecords() { using var rdr = GetStream(); rdr.BaseStream.Position = _folderRecordOffset; var folderHeaderLength = FolderRecord.HeaderLength(HeaderType); ReadOnlyMemorySlice <byte> folderHeaderData = rdr.ReadBytes(checked ((int)(folderHeaderLength * _folderCount))); var ret = new FolderRecord[_folderCount]; for (var idx = 0; idx < _folderCount; idx += 1) { ret[idx] = new FolderRecord(this, folderHeaderData.Slice(idx * folderHeaderLength, folderHeaderLength), idx); } // Slice off appropriate file header data per folder int fileCountTally = 0; foreach (var folder in ret) { folder.ProcessFileRecordHeadersBlock(rdr, fileCountTally); fileCountTally = checked ((int)(fileCountTally + folder.FileCount)); } if (HasFileNames) { var filenameBlock = new FileNameBlock(this, rdr.BaseStream.Position); foreach (var folder in ret) { folder.FileNameBlock = filenameBlock; } } return(ret); }
public FileRecord(BSAReader bsa, FolderRecord folderRecord, BinaryReader src, int index) { _index = index; _bsa = bsa; Hash = src.ReadUInt64(); var size = src.ReadUInt32(); FlipCompression = (size & (0x1 << 30)) > 0; if (FlipCompression) { _size = size ^ (0x1 << 30); } else { _size = size; } if (Compressed) { _size -= 4; } _offset = src.ReadUInt32(); Folder = folderRecord; var old_pos = src.BaseStream.Position; src.BaseStream.Position = _offset; if (bsa.HasNameBlobs) { _nameBlob = src.ReadStringLenNoTerm(bsa.HeaderType); } if (Compressed) { _originalSize = src.ReadUInt32(); } _onDiskSize = (uint)(_size - (_nameBlob == null ? 0 : _nameBlob.Length + 1)); if (Compressed) { _dataSize = _originalSize; _onDiskSize -= 4; } else { _dataSize = _onDiskSize; } _dataOffset = src.BaseStream.Position; src.BaseStream.Position = old_pos; }
public FileRecord(BSAReader bsa, FolderRecord folderRecord, BinaryReader src) { _bsa = bsa; _hash = src.ReadUInt64(); var size = src.ReadInt32(); _compressedFlag = (size & (0x1 << 30)) > 0; if (_compressedFlag) { _size = size ^ (0x1 << 30); } else { _size = size; } _offset = src.ReadInt32(); _folder = folderRecord; }
internal void LoadFileRecord(BSAReader bsaReader, FolderRecord folder, FileRecord file, BinaryReader rdr) { _name = rdr.ReadStringTerm(_bsa.HeaderType); }