コード例 #1
0
ファイル: TB.cs プロジェクト: Ziiella/DanganLib
        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);
            }
        }
コード例 #2
0
 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);
 }
コード例 #3
0
    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];
        }
    }
コード例 #4
0
ファイル: DataManager.cs プロジェクト: CucFlavius/WSEdit
 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);
     }
 }
コード例 #5
0
    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);
    }