// Copyright (c) 2026 Timofey Solomko // Licensed under MIT License // // See LICENSE for license information import Foundation import BitByteData struct XZBlock { let data: Data let unpaddedSize: Int var uncompressedSize: Int { return data.count } init(_ blockHeaderSize: UInt8, _ byteReader: LittleEndianByteReader, _ checkSize: Int) throws { let blockHeaderStartIndex = byteReader.offset - 1 let realBlockHeaderSize = (blockHeaderSize.toInt() + 1) * 4 let blockFlags = byteReader.byte() /** Bit values 00, 01, 10, 11 indicate filters number from 1 to 4, so we actually need to add 1 to get filters' number. */ let filtersCount = blockFlags & 0x03 + 1 guard blockFlags & 0x3C == 0 else { throw XZError.wrongField } /// Should match size of compressed data. let compressedSize = blockFlags & 0x40 != 0 ? try byteReader.multiByteDecode() : -1 /// Should match the size of data after decompression. let uncompressedSize = blockFlags & 0x80 != 0 ? try byteReader.multiByteDecode() : -1 var filters: [(LittleEndianByteReader) throws -> Data] = [] for _ in 0..