Swift:采用块模式的LZ4解码

时间:2018-11-21 17:39:41

标签: ios swift

在以块模式解码LZ4编码的数据时,我面临着艰难的时期,而Apple文档并没有帮助我获得结果,

这是我在iOS 12,Swift 4.1上的代码:

let intArray: [Int8] =  [-16, 1, 1, 39, 0, 19, 11, -30, 7, 10, 29, 14, 0, 0, 0, 0, 96, 9, 6, 0, 1, 2, 0, 17, 14, 6, 0, 2, 2, 0, 18, 14, 7, 0, 65, 0, 0, 0, -51, 6, 0, 0, 2, 0, 0, 43, 0, 16, 2, 9, 0, -1, 13, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 10, 4, 0, 64, 33, -105, 58, 115, 0, 12, 2, 0, 80, 0, 0, 0, 0, 0]

            let uintArray = intArray.map { UInt8(bitPattern: $0) }

// For Visibility the uintArray unsigned is [240, 1, 1, 39, 0, 19, 11, 226, 7, 10, 29, 14, 0, 0, 0, 0, 96, 9, 6, 0, 1, 2, 0, 17, 14, 6, 0, 2, 2, 0, 18, 14, 7, 0, 65, 0, 0, 0, 205, 6, 0, 0, 2, 0, 0, 43, 0, 16, 2, 9, 0, 255, 13, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 10, 4, 0, 64, 33, 151, 58, 115, 0, 12, 2, 0, 80, 0, 0, 0, 0, 0]

            var encodedData = Data.init(bytes:uintArray)

            let decodedCapacity = 205
            let decodedDestinationBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: decodedCapacity)

            let decodedData = encodedData.withUnsafeBytes {
                (encodedSourceBuffer: UnsafePointer<UInt8>) -> Data? in

                let decodedCharCount = compression_decode_buffer(decodedDestinationBuffer,
                                                                 decodedCapacity,
                                                                 encodedSourceBuffer,
                                                                 encodedData.count,
                                                                 nil,
                                                                 COMPRESSION_LZ4)

                if decodedCharCount == 0 {
                    fatalError("Decoding failed.")
                }

                print("Before: \(encodedSourceBuffer) | After: \(decodedCharCount)")

                return Data(bytesNoCopy: decodedDestinationBuffer, count: decodedCharCount, deallocator: .free)

            }

引用来自:https://developer.apple.com/documentation/compression/compressing_and_decompressing_data_with_buffer_compression

在此先感谢您的帮助!

当前输出:解码失败

以符号字节为单位的预期输出:

[1, 39, 0, 19, 11, -30, 7, 10, 29, 14, 0, 0, 0, 0, 96, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 9, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, -105, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

无符号字节的预期输出:

[1, 39, 0, 19, 11, 226, 7, 10, 29, 14, 0, 0, 0, 0, 96, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 9, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 151, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

1 个答案:

答案 0 :(得分:0)

再次因抱怨Apple文档而表示歉意

他们清楚地提到了

压缩块头由八位字节0x62、0x76、0x34和0x31组成,其后是该块表示的已解码(明文)数据的字节大小和存储在其中的编码数据的大小(字节)块。标头将两个大小字段都存储为(可能未对齐)32位little-endian值。实际的LZ4编码数据流紧随压缩块头之后。

就我而言,我不需要标题,

因此,最好的常数将是COMPRESSION_LZ4_RAW,这是LZ4压缩算法,没有帧头。

将算法类型COMPRESSION_LZ4更改为COMPRESSION_LZ4_RAW已解决问题