Пример #1
0
        void ReadV2(uint record_size)
        {
            uint index_offset     = 0;
            var  first_offset_str = m_enc.GetString(m_entry_buf, 8, 8);
            uint first_offset     = Convert.ToUInt32(first_offset_str, 16);

            while (index_offset < first_offset)
            {
                var offset_str = m_enc.GetString(m_entry_buf, 8, 8);
                var offset     = Convert.ToUInt32(offset_str, 16);
                if (m_file.MaxOffset == offset)
                {
                    break;
                }
                var name  = m_enc.GetString(m_entry_buf, 0, 8);
                var entry = new OdnEntry {
                    Name = name, Offset = offset
                };
                m_dir.Add(entry);
                index_offset += record_size;
                if (record_size != m_file.View.Read(index_offset, m_entry_buf, 0, record_size))
                {
                    throw new InvalidFormatException();
                }
            }
        }
Пример #2
0
        void ReadEncrypted(byte key)
        {
            uint index_offset = 0;

            for (;;)
            {
                index_offset += 0x10;
                if (m_entry_buf.AsciiEqual(0, "ffffffffffffffff"))
                {
                    break;
                }
                var name   = m_enc.GetString(m_entry_buf, 0, 8);
                var offset = m_enc.GetString(m_entry_buf, 8, 8);
                var entry  = new OdnEntry {
                    Name = name, Offset = Convert.ToUInt32(offset, 16)
                };
                m_dir.Add(entry);
                if (0x10 != m_file.View.Read(index_offset, m_entry_buf, 0, 0x10))
                {
                    throw new InvalidFormatException();
                }
                key = OdnOpener.Decrypt(m_entry_buf, 0x10, key);
            }
            foreach (var entry in m_dir)
            {
                entry.Offset += index_offset;
            }
        }
Пример #3
0
        void ReadV1()
        {
            uint index_offset = 0;

            for (;;)
            {
                if (0x10 != m_file.View.Read(index_offset, m_entry_buf, 0, 0x10))
                {
                    throw new InvalidFormatException();
                }
                index_offset += 0x10;
                if (m_entry_buf.AsciiEqual(0, "END_ffffffffffff"))
                {
                    break;
                }
                else if (m_entry_buf.AsciiEqual(0, "ffffffffffffffff"))
                {
                    m_scripts_encrypted = false;
                    break;
                }
                else if (m_entry_buf.AsciiEqual(0, "HIME_END"))
                {
                    index_offset += 8;
                    break;
                }
                var name   = m_enc.GetString(m_entry_buf, 0, 8);
                var offset = m_enc.GetString(m_entry_buf, 8, 8);
                var entry  = new OdnEntry {
                    Name = name, Offset = Convert.ToUInt32(offset, 16)
                };
                m_dir.Add(entry);
            }
            foreach (OdnEntry entry in m_dir)
            {
                entry.Offset += index_offset;
            }
            if (m_dir.Any() && m_dir[m_dir.Count - 1].Offset == m_file.MaxOffset)
            {
                m_dir.RemoveAt(m_dir.Count - 1);
            }
        }