/** * Reads one entry of the indexTable and return it's values in a SFOIndexTableEntry-object * @param fIn * @return SFOIndexTableEntry * @throws IOException */ public static SFOIndexTableEntry ReadEntry(Stream fIn) { SFOIndexTableEntry sfoIndexTableEntry = new SFOIndexTableEntry(); byte[] tempByteArray1 = new byte[1]; byte[] tempByteArray2 = new byte[2]; byte[] tempByteArray4 = new byte[4]; // read offsetKeyNameInKeyTable fIn.Read(tempByteArray2, 0, 2); sfoIndexTableEntry.SetOffsetKeyNameInKeyTable(tempByteArray2); // read dataAlignmentRequirements fIn.Read(tempByteArray1, 0, 1); sfoIndexTableEntry.SetDataAlignmentRequirements(tempByteArray1[0]); // read dataTypeValue fIn.Read(tempByteArray1, 0, 1); sfoIndexTableEntry.SetDataTypeValue(tempByteArray1[0]); // read sizeValueData fIn.Read(tempByteArray4, 0, 4); sfoIndexTableEntry.SetSizeValueData(SFOReaderUtilities.ByteArrayReverseToInt(tempByteArray4)); // read sizeValueDataAndPadding fIn.Read(tempByteArray4, 0, 4); sfoIndexTableEntry.SetSizeValueDataAndPadding(SFOReaderUtilities.ByteArrayReverseToInt(tempByteArray4)); // read offsetDataValueInDataTable fIn.Read(tempByteArray4, 0, 4); sfoIndexTableEntry.SetOffsetDataValueInDataTable(SFOReaderUtilities.ByteArrayReverseToInt(tempByteArray4)); return(sfoIndexTableEntry); }
/** * Reads an entry of the dataValueTable an return it as String * * @param fIn * @param sfoIndexTableEntry * @return String * @throws IOException */ public string ReadEntry(Stream sfoFile, SFOIndexTableEntry sfoIndexTableEntry) { byte[] entryByteArray = new byte[sfoIndexTableEntry.GetSizeValueData()]; sfoFile.Read(entryByteArray, 0, sfoIndexTableEntry.GetSizeValueData()); this.valueBytesReaded += sfoIndexTableEntry.GetSizeValueData(); long offsetNextValue = sfoIndexTableEntry.GetOffsetDataValueInDataTable() + sfoIndexTableEntry.GetSizeValueDataAndPadding(); // korrekt! long skipBytes = offsetNextValue - this.valueBytesReaded; sfoFile.Seek(skipBytes, SeekOrigin.Current); this.valueBytesReaded += Convert.ToInt32(skipBytes); return(SFOReaderUtilities.ByteArrayToString(entryByteArray, true)); }
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]); } }