Ejemplo n.º 1
0
        public override object Read(ExtendedBinaryReader reader)
        {
            // Byte manipulation because of ClickHouse's weird GUID/UUID implementation
            var bytes = new byte[16];

            reader.Read(bytes, 6, 2);
            reader.Read(bytes, 4, 2);
            reader.Read(bytes, 0, 4);
            reader.Read(bytes, 8, 8);
            Array.Reverse(bytes, 8, 8);
            return(new Guid(bytes));
        }
Ejemplo n.º 2
0
        // Methods
        public override void Load(Stream fileStream)
        {
            // HEADER
            var  reader         = new ExtendedBinaryReader(fileStream, Encoding.ASCII, true);
            uint fileCount      = reader.ReadUInt32();
            uint entriesOffset  = reader.ReadUInt32();
            uint fileDataOffset = reader.ReadUInt32();

            // DATA
            var stringBuffer = new char[stringBufferSize];
            var fileEntries  = new FileEntry[fileCount];

            reader.JumpTo(entriesOffset, true);

            for (uint i = 0; i < fileCount; ++i)
            {
                // Read File Name
                reader.Read(stringBuffer, 0, stringBufferSize);
                string fileName =
                    new string(stringBuffer).Replace("\0", string.Empty);

                // Read File Entry Data
                uint fileIndex = reader.ReadUInt32();
                fileEntries[fileIndex] = new FileEntry()
                {
                    FileName         = fileName,
                    FileIndex        = fileIndex,
                    DataOffset       = reader.ReadUInt32(),
                    DataLength       = reader.ReadUInt32(),
                    UncompressedSize = reader.ReadUInt32()
                };
            }

            // Read File Data
            for (uint i = 0; i < fileCount; ++i)
            {
                var fileEntry = fileEntries[i];
                var data      = new byte[fileEntry.DataLength];
                int pos       = 0;

                reader.JumpTo(fileEntry.DataOffset, true);
                while (pos < data.Length)
                {
                    // TODO: De-compress files.
                    pos += reader.Read(data, pos, data.Length - pos);
                }

                // Add File to Files List
                Data.Add(new ArchiveFile(fileEntry.FileName, data));
            }
        }
Ejemplo n.º 3
0
 //read block but do not uncompress
 public void ReadCompressedBytes(ExtendedBinaryReader reader)
 {
     _compressedLength = reader.ReadOptInt32();
     _firstPosition    = reader.ReadOptInt32();
     //_lastPosition   = reader.ReadOptInt32();
     _count = reader.ReadOptInt32();
     reader.Read(_compressedBlock, 0, _compressedLength);
 }
Ejemplo n.º 4
0
        public void Read(ExtendedBinaryReader reader)
        {
            _compressedLength = reader.ReadOptInt32();
            _firstPosition    = reader.ReadOptInt32();
            //_lastPosition = reader.ReadOptInt32();
            _count = reader.ReadOptInt32();
            reader.Read(_compressedBlock, 0, _compressedLength);

            _uncompressedLength = _compressionAlgorithm.Decompress(_compressedBlock, _compressedLength,
                                                                   _uncompressedBlock, _uncompressedBlock.Length);
        }
Ejemplo n.º 5
0
        protected void LoadHeroesArchive(ExtendedBinaryReader reader)
        {
            // HEADER
            uint padding = reader.ReadUInt32();

            if (padding != 0)
            {
                Console.WriteLine("WARNING: Padding is not 0! ({0})", padding);
            }

            uint fileSize = reader.ReadUInt32() + 0xC;

            if (fileSize != reader.BaseStream.Length)
            {
                // Written like this to avoid the + operator and keep the line under 100 chars
                Console.WriteLine("{0} (Got {1} expected {2})",
                                  "WARNING: File-Size in archive appears incorrect!",
                                  fileSize, reader.BaseStream.Length);
            }

            Magic = reader.ReadUInt32();
            uint unknown1 = reader.ReadUInt32();

            if (unknown1 != 1)
            {
                Console.WriteLine("WARNING: Unknown1 is not 1! ({0})", unknown1);
            }

            uint dataOffset = reader.ReadUInt32(); // TODO: Ensure this is correct
            uint magic2     = reader.ReadUInt32();

            // DATA
            var stringBuffer = new char[StringLength];
            var fileNames    = new string[FileEntryCount];

            // File Names
            for (uint i = 0; i < FileEntryCount; ++i)
            {
                if (reader.BaseStream.Position + StringLength >= fileSize)
                {
                    break;
                }

                reader.Read(stringBuffer, 0, StringLength);
                fileNames[i] = new string(stringBuffer).Replace("\0", string.Empty);
            }

            // File Entries
            reader.JumpTo(dataOffset, true);

            while (reader.BaseStream.Position < fileSize)
            {
                uint fileNameIndex = reader.ReadUInt32();
                uint dataLength    = reader.ReadUInt32();
                uint magic3        = reader.ReadUInt32();

                if (dataLength > 0)
                {
                    var data = reader.ReadBytes((int)dataLength);
                    Data.Add(new ArchiveFile(fileNames[fileNameIndex], data));
                }
            }
        }