public void Parse(BinaryReader BinaryFile) { TBFile = BinaryFile ?? throw new ArgumentException("Alreading operating on a file.", "br"); Signature = Encoding.UTF8.GetString(TBFile.ReadBytes(2)); if (!ValidSignature()) { return; } TBFile.ReadBytes(5); //Unknown bytes FileCount = TBFile.ReadUInt32(); for (int i = 0; i < FileCount; i++) { Archive.FileEntry FileEntry = new Archive.FileEntry(); FileEntry.Name = TBFile.ReadString(); FileEntry.Offset = TBFile.ReadUInt32(); FileEntry.Size = TBFile.ReadUInt32(); TBFile.ReadBytes(16); //Unknown bytes FileEntries.Add(FileEntry); } }
private Archive.FileEntry ReadFileEntry(BinaryReader br) { Archive.FileEntry fileEntry = new Archive.FileEntry(); fileEntry.nameOffset = br.ReadUInt32(); fileEntry.flags = br.ReadUInt32(); fileEntry.writeTime = br.ReadUInt64(); fileEntry.uncompressedSize = br.ReadUInt64(); fileEntry.compressedSize = br.ReadUInt64(); fileEntry.hash = br.ReadBytes(20); fileEntry.unk2 = br.ReadUInt32(); return(fileEntry); }
private void CreateFileIcon(string Name, Archive.FileEntry FileInfo) { GameObject fileIcon = Instantiate(fileIconPrefab); fileIcon.GetComponent <FileInstance>().fileName = Name; fileIcon.GetComponent <FileInstance>().fileEntry = FileInfo; fileIcon.transform.SetParent(iconArea.transform); fileIcon.transform.localScale = Vector3.one; fileIcon.transform.GetChild(0).GetComponent <UnityEngine.UI.Text>().text = Name; if (Path.GetExtension(Name).ToLower() == ".tex") { fileIcon.transform.GetChild(1).GetComponent <UnityEngine.UI.Image>().sprite = icons[0]; } }
public static byte[] GetFileBytes(string path) { if (fileList.ContainsKey(path)) { Archive.FileEntry fileEntry = fileList[path]; uint compression = fileEntry.flags;// 3: zlib compressed, 5: lzma compressed byte[] data; byte[] byteHash = fileEntry.hash; string hash = ToHex(byteHash); if (ArchiveFile.aarcEntries.ContainsKey(hash)) { Archive.AARCEntry aarcEntry = ArchiveFile.aarcEntries[hash]; Archive.PackBlockHeader packBlockHeader = ArchiveFile.packBlockHeaders[(int)aarcEntry.blockIndex]; string filePath = Path.GetDirectoryName(installLocation) + "\\Patch\\" + dataSource + ".archive"; using (FileStream fs = File.OpenRead(filePath)) { using (BinaryReader br = new BinaryReader(fs)) { br.BaseStream.Seek((long)packBlockHeader.blockOffset, SeekOrigin.Begin); data = br.ReadBytes((int)packBlockHeader.blockSize); } } //Console.Log((int)fileEntry.uncompressedSize + " " + fileEntry.uncompressedSize); if (compression == 3) { return(DecompressZlib(data, (int)fileEntry.uncompressedSize)); } else if (compression == 5) { return(DecompressLzma(data, (int)fileEntry.uncompressedSize)); } else { return(data); } } else { Console.Log("Missing AARC Entry : " + hash, Console.LogType.Error); return(null); } } else { Console.Log("Missing File : " + path, Console.LogType.Error); return(null); } }
private Archive.FolderBlock ReadBlock(int blockNumber, string currentDir, BinaryReader br) { br.BaseStream.Seek((long)packBlockHeaders[blockNumber].blockOffset, SeekOrigin.Begin); Archive.FolderBlock folderBlock = new Archive.FolderBlock(); folderBlock.numSubdirectories = br.ReadUInt32(); folderBlock.numFiles = br.ReadUInt32(); if (folderBlock.numSubdirectories > 0) { Archive.DirectoryEntry[] directoryEntries = new Archive.DirectoryEntry[folderBlock.numSubdirectories]; for (int i = 0; i < folderBlock.numSubdirectories; i++) { directoryEntries[i] = ReadDirectoryEntry(br); } folderBlock.subDirectories = directoryEntries; } if (folderBlock.numFiles > 0) { Archive.FileEntry[] fileEntries = new Archive.FileEntry[folderBlock.numFiles]; for (int i = 0; i < folderBlock.numFiles; i++) { fileEntries[i] = ReadFileEntry(br); } folderBlock.files = fileEntries; } long remainingSize = (long)packBlockHeaders[blockNumber].blockSize - (br.BaseStream.Position - (long)packBlockHeaders[blockNumber].blockOffset); char[] nameslist = new char[remainingSize]; for (int i = 0; i < remainingSize; i++) { nameslist[i] = br.ReadChar(); } folderBlock.names = nameslist; if (folderBlock.subDirectories != null) { foreach (Archive.DirectoryEntry directoryEntry in folderBlock.subDirectories) { string word = ""; int increment = 0; for (int t = 0; t < 200; t++) { char c = folderBlock.names[directoryEntry.nameOffset + increment]; increment++; if (c != '\0') { word += c; } else { break; } } Archive.FolderBlock fB = ReadBlock((int)directoryEntry.nextBlock, currentDir + "\\" + word, br); DataManager.DirectoryTree.Add(currentDir + "\\" + word, fB); } } //long currentStreamPosition = br.BaseStream.Position; if (folderBlock.files != null) { foreach (Archive.FileEntry fileEntry in folderBlock.files) { //br.BaseStream.Seek(fileEntry.nameOffset, SeekOrigin.Begin); string word = ""; int increment = 0; for (int t = 0; t < 200; t++) { char c = folderBlock.names[fileEntry.nameOffset + increment]; //br.ReadChar(); increment++; if (c != '\0') { word += c; } else { break; } } //DataManager.FileNames.Add(fileEntry.nameOffset, word); string hash = DataManager.ToHex(fileEntry.hash); if (!DataManager.FileNames.ContainsKey(hash)) { DataManager.FileNames.Add(hash, word); } //else //Console.Log(DataManager.FileNames[fileEntry.nameOffset] + " " + word); DataManager.fileList.Add(currentDir + "\\" + word, fileEntry); } } //br.BaseStream.Seek(currentStreamPosition, SeekOrigin.Begin); return(folderBlock); }