/// <summary> /// Read from stream the sfp file header. /// </summary> /// <param name="strm">Sfp stream data.</param> /// <returns>Sfp file header.</returns> private static unsafe SfpHeader ReadHeader(Stream strm) { Byte[] data = new Byte[sizeof(SfpHeader)]; strm.Seek(0, SeekOrigin.Begin); strm.Read(data, 0, data.Length); return(SfpHeader.CreateFromBytes(data)); }
/// <summary> /// Extract the content of a sfp file from a stream. /// </summary> /// <param name="strm">Sfp stream data.</param> /// <param name="overwrite">Indicates whether the files should be overwritten.</param> /// <param name="extractPath">Extraction path.</param> private static void ExtractStream(Stream strm, Boolean overwrite, String extractPath) { SfpHeader header = ReadHeader(strm); if (header.ArchiveSize == strm.Length) //1st Validation { IReadOnlyDictionary <Int64, String> nameTable = ReadNameTable(strm, header); if (!nameTable.ContainsKey(0)) //2nd Validation { Dictionary <Int64, SfpEntry> entries = new Dictionary <Int64, SfpEntry>(); ReadEntry(strm, header.FirstEntryOffset, entries); ExtractFiles(strm, nameTable, entries, overwrite, extractPath); } else { Console.WriteLine("Selected file is not a valid sfp. An error found in the file name table."); } } else { Console.WriteLine("Selected file is not a valid sfp. An error found in the file header."); } }
/// <summary> /// Read the table of names in the sfp file and index them by offset. /// </summary> /// <param name="strm">Sfp stream data.</param> /// <param name="header">Sfp file header</param> /// <returns>Sfp file name table indexed by offset.</returns> private static IReadOnlyDictionary <Int64, String> ReadNameTable(Stream strm, SfpHeader header) { Dictionary <Int64, String> nameTable = new Dictionary <Int64, String>(); Byte[] data = new Byte[header.DataOffset - header.NameTableOffset]; strm.Seek(header.NameTableOffset, SeekOrigin.Begin); strm.Read(data, 0, data.Length); Int32 pos_ini = 0; Int32 pos_fin = 0; List <Byte> lista = data.ToList <Byte>(); foreach (Byte bytChar in lista) { pos_fin++; if (bytChar == 0) { if (pos_fin - pos_ini > 1) { nameTable.Add(header.NameTableOffset + (Int64)pos_ini, Encoding.ASCII.GetString(lista.GetRange(pos_ini, pos_fin - pos_ini - 1).ToArray())); } pos_ini = pos_fin; } } return(nameTable); }