示例#1
0
 /// <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));
 }
示例#2
0
        /// <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.");
            }
        }
示例#3
0
        /// <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);
        }