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)); }
// 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)); } }
//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); }
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); }
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)); } } }