Beispiel #1
0
        private bool Parse( BinaryReader reader )
        {
            SfoHeader header = new SfoHeader( reader );
            if( ( header.Magic[ 0 ] != 0 ) ||
                ( header.Magic[ 1 ] != 'P' ) ||
                ( header.Magic[ 2 ] != 'S' ) ||
                ( header.Magic[ 3 ] != 'F' ) )
            {
                // Bad
                return false;
            }

            List<SfoSection> sections = new List<SfoSection>( ( int )header.SectionCount );
            for( int n = 0; n < header.SectionCount; n++ )
            {
                SfoSection section = new SfoSection( reader );
                sections.Add( section );
            }

            foreach( SfoSection section in sections )
            {
                SfoEntry entry = new SfoEntry();
                entry.DataType = section.DataType;

                // Label
                reader.BaseStream.Seek( header.LabelOffset + section.LabelOffset, SeekOrigin.Begin );
                StringBuilder label = new StringBuilder( 256 );
                for( int n = 0; n < 512; n++ )
                {
                    char c = reader.ReadChar();
                    if( c == 0 )
                        break;
                    label.Append( c );
                }
                entry.Label = label.ToString();

                // Data
                switch( entry.DataType )
                {
                    case SfoDataType.Binary:
                        // Don't decode
                        break;
                    case SfoDataType.Integer:
                        reader.BaseStream.Seek( header.DataOffset + section.DataOffset, SeekOrigin.Begin );
                        entry.Data = reader.ReadInt32();
                        break;
                    case SfoDataType.String:
                        reader.BaseStream.Seek( header.DataOffset + section.DataOffset, SeekOrigin.Begin );
                        byte[] bytes = reader.ReadBytes( ( int )section.DataFieldUsed );
                        entry.Data = Encoding.UTF8.GetString( bytes ).Trim().Replace( "\0", "" );
                        break;
                }

                _entries.Add( entry.Label, entry );
            }

            return true;
        }
Beispiel #2
0
        private bool Parse(BinaryReader reader)
        {
            SfoHeader header = new SfoHeader(reader);

            if ((header.Magic[0] != 0) ||
                (header.Magic[1] != 'P') ||
                (header.Magic[2] != 'S') ||
                (header.Magic[3] != 'F'))
            {
                // Bad
                return(false);
            }

            List <SfoSection> sections = new List <SfoSection>(( int )header.SectionCount);

            for (int n = 0; n < header.SectionCount; n++)
            {
                SfoSection section = new SfoSection(reader);
                sections.Add(section);
            }

            foreach (SfoSection section in sections)
            {
                SfoEntry entry = new SfoEntry();
                entry.DataType = section.DataType;

                // Label
                reader.BaseStream.Seek(header.LabelOffset + section.LabelOffset, SeekOrigin.Begin);
                StringBuilder label = new StringBuilder(256);
                for (int n = 0; n < 512; n++)
                {
                    char c = reader.ReadChar();
                    if (c == 0)
                    {
                        break;
                    }
                    label.Append(c);
                }
                entry.Label = label.ToString();

                // Data
                switch (entry.DataType)
                {
                case SfoDataType.Binary:
                    // Don't decode
                    break;

                case SfoDataType.Integer:
                    reader.BaseStream.Seek(header.DataOffset + section.DataOffset, SeekOrigin.Begin);
                    entry.Data = reader.ReadInt32();
                    break;

                case SfoDataType.String:
                    reader.BaseStream.Seek(header.DataOffset + section.DataOffset, SeekOrigin.Begin);
                    byte[] bytes = reader.ReadBytes(( int )section.DataFieldUsed);
                    entry.Data = Encoding.UTF8.GetString(bytes).Trim().Replace("\0", "");
                    break;
                }

                _entries.Add(entry.Label, entry);
            }

            return(true);
        }