Exemplo n.º 1
0
            /// <summary>
            /// Wandelt die Struktur in ein exportierbares Binärformat um.
            /// </summary>
            /// <returns></returns>
            public RAMBuffer ToBinary()
            {
                // Puffer erstellen
                RAMBuffer buff = new RAMBuffer();

                // DRS-Dateiname
                buff.WriteUInteger((uint)DRSFile.Length);
                buff.WriteString(DRSFile);

                // Datei-ID
                buff.WriteUInteger(FileID);

                // Ressourcen-Typ
                buff.WriteUInteger((uint)ResourceType.Length);
                buff.WriteString(ResourceType);

                // Data
                buff.WriteUInteger((uint)Data.Length);
                buff.Write(Data);

                // Fertig
                return buff;
            }
Exemplo n.º 2
0
        /// <summary>
        /// Schreibt die enthaltenen Daten in das interne RAMBuffer-Objekt.
        /// </summary>
        /// <remarks></remarks>
        public void WriteData()
        {
            // Puffer initialisieren
            _buffer = new RAMBuffer();

            // --- HEADER ---
            WriteString(_buffer, _header.Copyright, 40);
            WriteString(_buffer, _header.Version, 4);
            WriteString(_buffer, _header.FileType, 12);
            _buffer.WriteUInteger(_header.TableCount);

            // ErsteDateiOffset wird vor den Tabellen berechnet, daher erstmal 0
            _buffer.WriteUInteger(0);

            // Erstes Tabellen-Offset ausrechnen Hilft bei der Geschwindigkeitserhöhung beim TABELLEN-Prozess
            uint aktTableOffset = (uint)(_buffer.Position + _tableInfos.Count * 12);

            // --- TABELLENINFORMATIONEN ---
            TableInfo currTableInfo;
            for(int i = 0; i < _tableInfos.Count; ++i)
            {
                // Tabelleninformationen holen
                currTableInfo = _tableInfos[i];

                // Werte schreiben
                _buffer.WriteByte(currTableInfo.Unknown1);
                WriteString(_buffer, currTableInfo.ResourceType, 3);
                _buffer.WriteUInteger(aktTableOffset);
                _buffer.WriteUInteger(currTableInfo.FileCount);

                // Offset erhöhen
                aktTableOffset += currTableInfo.FileCount * 12;
            }

            // Erstes Datei-Offset ausrechnen Hilft bei der Geschwindigkeitserhöhung beim DATEIEN-Prozess
            uint aktFileOffset = (uint)_buffer.Position;
            for(int i = 0; i < _tables.Count; ++i)
                aktFileOffset += (uint)(_tables[i].Entries.Count * 12);

            // Header->ErsteDateiOffset
            uint aktPos = (uint)_buffer.Position;
            _buffer.Position = 60;
            _buffer.WriteUInteger(aktFileOffset);
            _buffer.Position = (int)aktPos;

            // --- TABELLEN ---
            Table currTable;
            TableEntry currEntry;
            for(int i = 0; i < _tables.Count; ++i)
            {
                // Tabelle abrufen
                currTable = _tables[i];

                // Einträge schreiben
                for(int j = 0; j < currTable.Entries.Count; ++j)
                {
                    // Eintrag abrufen
                    currEntry = currTable.Entries[j];

                    // Werte schreiben
                    _buffer.WriteUInteger(currEntry.FileID);
                    _buffer.WriteUInteger(aktFileOffset);
                    _buffer.WriteUInteger(currEntry.FileSize);

                    // Offset erhöhen
                    aktFileOffset += currEntry.FileSize;
                }
            }

            // --- DATEIEN ---
            foreach(Table aktT in _tables)
            {
                // Alle Einträge durchlaufen
                foreach(TableEntry currE in aktT.Entries)
                {
                    // Zum Eintrag gehörige Datei suchen
                    foreach(KeyValuePair<uint, byte[]> currFile in _files)
                    {
                        // Datei gefunden?
                        if(currE.FileID == currFile.Key)
                        {
                            _buffer.Write(currFile.Value);
                            break;
                        }
                    }
                }
            }
        }