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; }
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); }