Example #1
0
        public static SFOHeader Read(Stream fIn)
        {
            SFOHeader sfoHeader = new SFOHeader();

            byte[] tempByteArray = new byte[4];

            // read FileType
            fIn.Read(tempByteArray, 0, 4);
            sfoHeader.SetFileType(SFOReaderUtilities.ByteArrayToString(tempByteArray));

            // read sfoVerion
            fIn.Read(tempByteArray, 0, 4);
            sfoHeader.SetSfoVersion(SFOReaderUtilities.ByteArrayToString(tempByteArray));

            // read offsetKeyTable
            fIn.Read(tempByteArray, 0, 4);
            sfoHeader.SetOffsetKeyTable(SFOReaderUtilities.ByteArrayReverseToInt(tempByteArray));

            // read offsetValueTable
            fIn.Read(tempByteArray, 0, 4);
            sfoHeader.SetOffsetValueTable(SFOReaderUtilities.ByteArrayReverseToInt(tempByteArray));

            // read numberDataItem
            fIn.Read(tempByteArray, 0, 4);
            sfoHeader.SetNumberDataItems(SFOReaderUtilities.ByteArrayReverseToInt(tempByteArray));

            return(sfoHeader);
        }
Example #2
0
        private void Parse(Stream sfoFile)
        {
            // sfoHeader lesen
            this.sfoHeader = SFOHeader.Read(sfoFile);

            for (int i = 0; i < this.sfoHeader.GetNumberDataItems(); i++)
            {
                this.IndexTableEntries.Add(SFOIndexTableEntry.ReadEntry(sfoFile));
            }

            // Zum KeyTable Anfang springen
            // (offset der KeyTabelle - Header-Lהnge - Anzahl * IndexEntry Lהnge = restl. zu ignorierende Bytes)
            int skipBytesToKeyTable = this.sfoHeader.GetOffsetKeyTable() - SFOReader.headerSize -
                                      (this.sfoHeader.GetNumberDataItems() * SFOIndexTableEntry.IndexTableEntryLength);

            sfoFile.Seek(skipBytesToKeyTable, SeekOrigin.Current);

            // read KeyTable
            var sfoKeyTableEntry = new SfoKeyTableEntry();
            var keyTableEntries  = new List <string>();

            for (int i = 0; i < this.sfoHeader.GetNumberDataItems(); i++)
            {
                keyTableEntries.Add(sfoKeyTableEntry.ReadEntry(sfoFile));
            }

            long skipBytesToValueTable = this.sfoHeader.GetOffsetValueTable() - this.sfoHeader.GetOffsetKeyTable() -
                                         sfoKeyTableEntry.GetKeyTableLength();

            sfoFile.Seek(skipBytesToValueTable, SeekOrigin.Current);

            // read ValueTable
            SFOValueTableEntry sfoValueTableEntry = new SFOValueTableEntry();
            var valueTableEntries = new List <string>();

            for (int i = 0; i < this.sfoHeader.GetNumberDataItems(); i++)
            {
                valueTableEntries.Add(sfoValueTableEntry.ReadEntry(sfoFile, this.IndexTableEntries[i])
                                      .Replace("\0", string.Empty));
            }

            for (int i = 0; i < keyTableEntries.Count; i++)
            {
                this.KeyValues.Add(keyTableEntries[i], valueTableEntries[i]);
            }
        }