private void Init(Stream input) { using (var br = new BinaryReader(input)) { Header.Read(br); if (!Functions.CompareBytes(Header.Magic, new byte[] { 0, 0x50, 0x53, 0x46 })) { throw new Exception("Invalid PARAM.SFO Header Magic"); } var tables = new List <Index_table>(); for (var i = 0; i < Header.IndexTableEntries; i++) { var t = new Index_table(); t.Read(br); tables.Add(t); } var xtables = new List <Table>(); var count = 0; foreach (var t in tables) { var x = new Table { index = count, Indextable = t, Name = ReadName(br, t), Value = ReadValue(br, t) }; count++; xtables.Add(x); } Tables = xtables.ToArray(); br.Close(); } }
private string ReadName(BinaryReader br, Index_table table) { br.BaseStream.Position = (Header.KeyTableStart + table.param_key_offset); var name = ""; while (((byte)br.PeekChar()) != 0) { name += br.ReadChar(); } br.BaseStream.Position++; return(name); }
private string ReadValue(BinaryReader br, Index_table table) { br.BaseStream.Position = ((Header.DataTableStart) + table.param_data_offset); switch (table.param_data_fmt) { case FMT.ASCII: return(Encoding.ASCII.GetString(br.ReadBytes((int)table.param_data_max_len)).Replace("\0", "")); case FMT.UINT32: return(br.ReadUInt32().ToString()); case FMT.UTF_8: return(Encoding.UTF8.GetString(br.ReadBytes((int)table.param_data_max_len)).Replace("\0", "")); default: return(null); } }