public byte[] GetDecompressedData(SFATEntry entry) { if (!valid) { return(null); } var d = GetFileData(entry); return(BitConverter.ToUInt32(d, 0) == 0x307A6159 ? Yaz0_Decompress(d) : d); }
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); }
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()); }
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)); }
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}."); } }
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); }