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(); x.index = count; x.Indextable = t; x.Name = ReadName(br, t); x.Value = ReadValue(br, t); count++; xtables.Add(x); } Tables = xtables.ToArray(); br.Close(); } }
/// <summary> /// Start Reading the Parameter file /// </summary> /// <param name="input">Input Stream</param> private void Init(Stream input) { using (var br = new BinaryReader(input)) { Header.Read(br); var tables = new List <index_table>(); for (int i = 0; i < Header.IndexTableEntries; i++) { var t = new index_table(); t.Read(br); tables.Add(t); } var xtables = new List <Table>(); int count = 0; foreach (index_table t in tables) { var x = new Table(); x.index = count; x.Indextable = t; x.Name = ReadName(br, t); x.Value = ReadValue(br, t); count++; xtables.Add(x); } Tables = xtables; 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); } }
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; } }
private string ReadName(BinaryReader br, index_table table) { br.BaseStream.Position = (Header.KeyTableStart + table.param_key_offset); string name = ""; while (((byte) br.PeekChar()) != 0) name += br.ReadChar(); br.BaseStream.Position++; return name; }
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 (int i = 0; i < Header.IndexTableEntries; i++) { var t = new index_table(); t.Read(br); tables.Add(t); } var xtables = new List<Table>(); int count = 0; foreach (index_table t in tables) { var x = new Table(); x.index = count; x.Indextable = t; x.Name = ReadName(br, t); x.Value = ReadValue(br, t); count++; xtables.Add(x); } Tables = xtables.ToArray(); br.Close(); } }
public void SaveFile(PARAM_SFO psfo, string filename) { // Sort the values before we save them to the sfo file //Array.Sort(psfo.Tables); using (FileStream stream = File.Create(filename)) { using (StructWriter sw = new StructWriter(ByteOrder.LSB, stream)) { //build index table INDEX_TABLE_ENTRY[] indexes = new INDEX_TABLE_ENTRY[psfo.Tables.Length]; PARAM_SFO.Table[] mytables = psfo.Tables; PARAM_SFO.index_table[] myindexes = new index_table[psfo.Tables.Length]; string[] variablenames = new string[psfo.Tables.Length]; string[] variablevalues = new string[psfo.Tables.Length]; int curkeynameoffset = 0; uint curvalueoffset = 0; for (int idx = 0; idx < psfo.Tables.Length; idx++) { PARAM_SFO.Table value = psfo.Tables[idx]; PARAM_SFO.FMT datatype = FMT.UINT32; uint datasize = 0; switch (value.Indextable.param_data_fmt) { case FMT.ASCII: { datatype = FMT.ASCII; datasize = (uint)Encoding.UTF8.GetBytes(value.Value.ToString()).Length + 1; break; } case FMT.UINT32: { datatype = FMT.UINT32; datasize = 4; break; } case FMT.UTF_8: { datatype = FMT.UTF_8; datasize = (uint)Encoding.UTF8.GetBytes(value.Value.ToString()).Length + 1; break; } default: { throw new Exception("Unknown SFOType!"); } } if (value.Indextable.param_key_offset != (ushort)curkeynameoffset) { string breakpoint = "This is for debug testing"; } //value.Indextable.param_key_offset = (ushort)curkeynameoffset; if (value.Indextable.param_data_fmt != datatype) { string breakpoint = "This is for debug testing"; } //value.Indextable.param_data_fmt = datatype; if (value.Indextable.param_data_len != datasize) { string breakpoint = "This is for debug testing"; } //value.Indextable.param_data_len = datasize; //if (value.Indextable.param_data_max_len != GetPaddingSize(value.Name, datasize)) //{ // string breakpoint = "This is for debug testing"; //} //value.Indextable.param_data_max_len = GetPaddingSize(value.Name, datasize); if (value.Indextable.param_data_offset != curvalueoffset) { string breakpoint = "This is for debug testing"; } //value.Indextable.param_data_offset = curvalueoffset; //we already have all the keynames curvalueoffset += value.Indextable.param_data_max_len; indexes[idx].KeyNameOffset = (ushort)curkeynameoffset; indexes[idx].Unknown = 4; if (datatype == FMT.UTF_8) { indexes[idx].DataType = DATA_TYPE.BinaryData; } if (datatype == FMT.ASCII) { indexes[idx].DataType = DATA_TYPE.Utf8Text; } if (datatype == FMT.UINT32) { indexes[idx].DataType = DATA_TYPE.Si32Integer; } indexes[idx].ValueDataSize = datasize; indexes[idx].ValueDataSizePlusPadding = GetPaddingSize(value.Name, datasize); indexes[idx].DataValueOffset = curvalueoffset; curkeynameoffset += value.Name.Length + 1; variablenames[idx] = value.Name; myindexes[idx] = value.Indextable; variablevalues[idx] = value.Value; } SFO_HEADER sfoheader = new SFO_HEADER(); sfoheader.magic = 0; sfoheader.signature = new char[] { 'P', 'S', 'F' }; sfoheader.FileVersionHigh = 1; sfoheader.FileVersionLow = 1; sfoheader.Unknown1 = 0; sfoheader.Start_of_Variable_Name_Table = Header.KeyTableStart; //PadOffset(Marshal.SizeOf(sfoheader) + (psfo.Tables.Length * Marshal.SizeOf(typeof(PARAM_SFO.index_table))));// sfoheader.Start_of_Variable_Data_Table = Header.DataTableStart; //PadOffset(sfoheader.Start_of_Variable_Name_Table + curkeynameoffset);// sfoheader.NumberOfVariables = Header.IndexTableEntries; //(uint)psfo.Tables.Length;// sw.WriteStruct(sfoheader); // Write variable information... sw.WriteStructs(indexes); WritePadBytes(sw, sw.BaseStream.Position, sfoheader.Start_of_Variable_Name_Table); // Write variable names... sw.WriteStrings(StringType.NullTerminated, variablenames); WritePadBytes(sw, sw.BaseStream.Position, sfoheader.Start_of_Variable_Data_Table); // Write variable data... for (int idx = 0; idx < psfo.Tables.Length; idx++) { PARAM_SFO.Table value = psfo.Tables[idx]; switch (value.Indextable.param_data_fmt) { case FMT.UTF_8: { sw.Write(value.Value); break; } case FMT.UINT32: { sw.Write(Convert.ToUInt32(value.Value)); break; } case FMT.ASCII: { sw.Write(value.Value); break; } } long pos = sw.BaseStream.Position; WritePadBytes(sw, myindexes[idx].param_data_len, myindexes[idx].param_data_max_len); } } } }