Exemplo n.º 1
0
        public byte[] GetDecompressedData(SFATEntry entry)
        {
            if (!valid)
            {
                return(null);
            }
            var d = GetFileData(entry);

            return(BitConverter.ToUInt32(d, 0) == 0x307A6159
                ? Yaz0_Decompress(d)
                : d);
        }
Exemplo n.º 2
0
        public byte[] GetFileData(SFATEntry entry)
        {
            if (!valid)
            {
                return(null);
            }
            var len = entry.FileDataEnd - entry.FileDataStart;
            var d   = new byte[len];

            Array.Copy(Data, entry.FileDataStart + DataOffset, d, 0, len);
            return(d);
        }
Exemplo n.º 3
0
        public string GetFileHash(SFATEntry entry)
        {
            var sha256 = SHA256.Create();
            var hash   = sha256.ComputeHash(GetFileData(entry));
            var sb     = new StringBuilder();

            foreach (var t in hash)
            {
                sb.Append(t.ToString("X2"));
            }
            return(sb.ToString());
        }
Exemplo n.º 4
0
        public string GetFilePath(SFATEntry entry)
        {
            if (!valid)
            {
                return(Empty);
            }
            var sb  = new StringBuilder();
            var ofs = SFnt.StringOffset + (entry.FileNameOffset & 0xFFFFFF) * 4;

            while (Data[ofs] != 0)
            {
                sb.Append((char)Data[ofs++]);
            }

            return(sb.ToString().Replace('/', Path.DirectorySeparatorChar));
        }
Exemplo n.º 5
0
        static void WriteSARCFileData(Options opts, SFATEntry entry, string country, string path, string decompressed_path)
        {
            File.WriteAllBytes(path, sarc.GetFileData(entry));

            var prbdata = sarc.GetDecompressedData(entry);

            File.WriteAllBytes(decompressed_path, prbdata);

            if (BitConverter.ToUInt32(prbdata, 0) == 0x53425250) // 'PRBS'
            {
                var prb                 = new PRBS(prbdata);
                var png_dir_full        = Path.Combine("png", Path.Combine(Path.Combine("full", country), prb.CategoryName));
                var png_dir_tiles       = Path.Combine("png", Path.Combine(Path.Combine("tiles", country), prb.CategoryName));
                var png_dir_downsampled = Path.Combine("png", Path.Combine(Path.Combine("downsampled", country), prb.CategoryName));
                Directory.CreateDirectory(png_dir_full);
                Directory.CreateDirectory(png_dir_tiles);
                Directory.CreateDirectory(png_dir_downsampled);
                using (var bmp = prb.GetImage())
                {
                    bmp.Save(Path.GetFullPath(Path.Combine(png_dir_full, prb.ImageName + ".png")),
                             ImageFormat.Png);

                    if (prb.NumTiles == 1)
                    {
                        bmp.Save(
                            Path.GetFullPath(Path.Combine(png_dir_tiles, prb.ImageName + ".png")),
                            ImageFormat.Png);
                        bmp.Save(
                            Path.GetFullPath(Path.Combine(png_dir_downsampled, prb.ImageName + ".png")),
                            ImageFormat.Png);
                    }
                }
                if (prb.NumTiles > 1)
                {
                    using (var ptile = prb.GetTile(0))
                        ptile.Save(Path.GetFullPath(Path.Combine(png_dir_downsampled, prb.ImageName + ".downsampledpreview.png")), ImageFormat.Png);
                    for (var i = 0; i < prb.NumTiles; i++)
                    {
                        using (var tile = prb.GetTile(i + 1))
                            tile.Save(Path.GetFullPath(Path.Combine(png_dir_tiles, prb.ImageName + $".tile_{i}.png")), ImageFormat.Png);
                    }
                }

                Util.Log($"Saved {country} images for {prb.ImageName}.");
            }
        }
Exemplo n.º 6
0
        public static SARC Analyze(string path)
        {
            var sarc = new SARC
            {
                FileName  = Path.GetFileNameWithoutExtension(path),
                FilePath  = Path.GetDirectoryName(path),
                Extension = Path.GetExtension(path),
                valid     = true
            };

            using (var fs = File.OpenRead(path))
                using (var br = new BinaryReader(fs))
                {
                    sarc.Signature = new string(br.ReadChars(4));
                    if (sarc.Signature != "SARC")
                    {
                        sarc.valid = false;
                        return(sarc);
                    }
                    sarc.HeaderSize = br.ReadUInt16();
                    sarc.Endianness = br.ReadUInt16();
                    sarc.FileSize   = br.ReadUInt32();
                    sarc.DataOffset = br.ReadUInt32();
                    sarc.Unknown    = br.ReadUInt32();
                    sarc.SFat       = new SFAT
                    {
                        Signature  = new string(br.ReadChars(4)),
                        HeaderSize = br.ReadUInt16(),
                        EntryCount = br.ReadUInt16(),
                        HashMult   = br.ReadUInt32(),
                        Entries    = new List <SFATEntry>()
                    };
                    if (sarc.SFat.Signature != "SFAT")
                    {
                        sarc.valid = false;
                        return(sarc);
                    }
                    for (var i = 0; i < sarc.SFat.EntryCount; i++)
                    {
                        var s = new SFATEntry
                        {
                            FileNameHash   = br.ReadUInt32(),
                            FileNameOffset = br.ReadUInt32(),
                            FileDataStart  = br.ReadUInt32(),
                            FileDataEnd    = br.ReadUInt32()
                        };
                        sarc.SFat.Entries.Add(s);
                    }
                    sarc.SFnt = new SFNT
                    {
                        Signature    = new string(br.ReadChars(4)),
                        HeaderSize   = br.ReadUInt16(),
                        Unknown      = br.ReadUInt16(),
                        StringOffset = (uint)br.BaseStream.Position
                    };
                    if (sarc.SFnt.Signature != "SFNT")
                    {
                        sarc.valid = false;
                        return(sarc);
                    }
                }
            sarc.Data = File.ReadAllBytes(path);
            if (sarc.FileSize == sarc.Data.Length)
            {
                return(sarc);
            }

            sarc.valid = false;
            sarc.Data  = null;
            return(sarc);
        }