lz4解压缩

最近项目用到了lz4解压缩,简单记录一下

iOS

+ (NSData *)deCompressToData:(NSString *)str size:(size_t)destsize {
    NSData *d = [self convertHexStrToData:str];
    size_t destSize = destsize;
    uint8_t *destBuf = malloc(sizeof(uint8_t) * destSize);
    const uint8_t *src_buffer = (const uint8_t *)[d bytes];
    size_t src_size = d.length;
    ///lz4 解压
    size_t decompressedSize = compression_decode_buffer(destBuf, destSize, src_buffer, src_size,
                                                            NULL, COMPRESSION_LZ4_RAW);
    NSData *adata = [[NSData alloc]initWithBytes:destBuf length:destSize];
    
    return adata;
}
//将16进制的字符串转换成NSData
+ (NSData *)convertHexStrToData:(NSString *)str {
    if (!str || [str length] == 0) {
        return nil;
    }
    
    NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:8];
    NSRange range;
    if ([str length] %2 == 0) {
        range = NSMakeRange(0,2);
    } else {
        range = NSMakeRange(0,1);
    }
    for (NSInteger i = range.location; i < [str length]; i += 2) {
        unsigned int anInt;
        NSString *hexCharStr = [str substringWithRange:range];
        NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];
        
        [scanner scanHexInt:&anInt];
        NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];
        [hexData appendData:entity];
        
        range.location += range.length;
        range.length = 2;
    }
    
    return [hexData copy];
}

安卓

/**
     * 数据解压缩
     * @param data 数据
     * @return
     * @throws IOException
     */
    @Throws(IOException::class)
    fun deCompress(data: ByteArray): ByteArray? {
        var data = data
        val bais = ByteArrayInputStream(data)
        val baos = ByteArrayOutputStream()

        // 解压缩
        deCompress(bais, baos)
        data = baos.toByteArray()
        baos.flush()
        baos.close()
        bais.close()
        return data
    }

/**
     * 解压缩
     * @param is 输入流
     * @param os 输出流
     * @throws IOException
     */
    @Throws(IOException::class)
    private fun deCompress(`is`: InputStream, os: OutputStream) {
        val bcis = BlockLZ4CompressorInputStream(`is`)
        var count: Int
        val data = ByteArray(BUFFER)
        while (bcis.read(data, 0, BUFFER).also { count = it } != -1) {
            os.write(data, 0, count)
        }
        bcis.close()
    }

我这边是构建原生插件给到flutter这边使用的,可自行入参调整一下方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容