【问题标题】:Using the iOS9 Compression Framework in Swift2在 Swift2 中使用 iOS9 压缩框架
【发布时间】:2015-11-07 03:46:03
【问题描述】:

我有一些使用 DEFLATE 压缩协议存储的 NSData

DEFLATE 压缩方式 DEFLATE 是一种无损压缩数据 使用 LZ77 算法组合压缩数据的格式 和霍夫曼编码,效率堪比目前最好的 可用的通用压缩方法。数据可以 生产或消费,即使是任意长的顺序 呈现的输入数据流,仅使用优先级有界的数量 中间存储。该格式可以很容易地实现 专利未涵盖的方式。可以找到 DEFLATE 的规格 在 RFC 1951 - DEFLATE 压缩数据格式规范,1996 年 5 月。

如果我在 IOS9 中理解正确,则有一个新的Compression Framework“可能”处理这种情况。文档列出了以下支持的算法:LZFSE、LZ4、LZMA 和 ZLIB 5 级。

我不确定,但我相信 ZLIB 支持 LZ77 Deflate 算法。我的问题是我如何实际使用这个框架:

所以我相信我想使用的功能是compression_decode_buffer

@available(iOS 9.0, *)
public func compression_decode_buffer(
    dst_buffer: UnsafeMutablePointer<UInt8>, 
    _ dst_size: Int, 
    _ src_buffer: UnsafePointer<UInt8>, 
    _ src_size: Int, 
    _ scratch_buffer: UnsafeMutablePointer<Void>, 
    _ algorithm: compression_algorithm) -> Int

但我不确定如何使用此算法。

所以从阅读标题看来,我需要输入大小 dst_size: bytes.sizeoutput size inputBuffer &amp;outputbuffercompression algorithm

dst_buffer: UnsafeMutablePointer, _ dst_size:整数, _ src_buffer:不安全指针, _ src_size:整数, _ scratch_buffer: UnsafeMutablePointer, _算法:compression_algorithm) -> Int

假设我有一些样本数据(见下文)

let bytes : [UInt8] = [ .... ]  // see below

compression_decode_buffer(
  <DST_BUFFER>,
  <DST_SIZE>, 
  bytes, 
  bytes.count, 
  <SCRATCH_BUFFER>, 
  COMPRESSION_ZLIB
)

我不知所措的是 中的内容。

有什么建议吗?

样本数据

let bytes : [UInt8] = [0x7e, 0x07, 0x07, 0xff, 0xff, 0x41, /* <1~....A */
    0x10, 0x33, 0x51, 0x3e, 0x94, 0xb2, 0xa0, 0x27, /* .3Q>...' */
    0x80, 0x00, 0x21, 0x65, 0x26, 0xd8, 0x22, 0x10, /* ..!e&.". */
    0x2c, 0xd5, 0x99, 0x00, 0x00, 0x44, 0xbb, 0xd4, /* ,....D.. */
    0x54, 0x38, 0xf5, 0x01, 0x36, 0xd1, 0x20, 0x2c, /* T8..6. , */
    0xd5, 0x99, 0xbb, 0x1c, 0xaf, 0xc3, 0x2c, 0x60, /* ......,` */
    0xcb, 0x0c, 0x79, 0xcb, 0x76, 0xa0, 0x84, 0xd5, /* ..y.v... */
    0x99, 0x83, 0x1c, 0xaf, 0xc3, 0x2c, 0x60, 0x35, /* .....,`5 */
    0x66, 0x60, 0x49, 0x76, 0x60, 0xc7, 0x5b, 0xf3, /* f`Iv`.[. */
    0xce, 0x05, 0x08, 0x3a, 0x04, 0x13, 0x4a, 0x00, /* ...:..J. */
    0x92, 0x05, 0x08, 0x17, 0x14, 0x68, 0x31, 0xc3, /* .....h1. */
    0x1c, 0xb2, 0xc3, 0x1e, 0x72, 0xdd, 0xe0, 0x00, /* ....r... */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
    0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, /* ....'... */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, /* .......0 */
    0x8e, 0x7e]

【问题讨论】:

  • 您确定数据是 DEFLATE 压缩的吗?我尝试了各种方法,但无法解压缩。你能说出这些数据是如何产生的吗?
  • 呃 - 我只是仔细看了看。这是 FIS-B 数据(航空数据),看起来在任一裂隙上都有 7e 填充,并且“blob”中的某处是一些数据。即使我的数据错误,您是否有示例说明如何在压缩库中使用 DEFLAT?这可能足以让我继续前进?

标签: ios compression zlib swift2


【解决方案1】:

一般compression_decode_buffer()是这样使用的:

import Compression

let bytes : [UInt8] = [ .... ]  // Compressed data
var dst = [UInt8](count: 1000, repeatedValue: 0) // destination buffer
let size = compression_decode_buffer(&dst, dst.count, bytes, bytes.count, nil, COMPRESSION_ZLIB)

目标缓冲区必须足够大以容纳解压缩的数据。 返回时,size 是写入到 目标缓冲区(如果解压缩失败,则为零)。

(还有一个“流式”接口

compression_stream_init()
compression_stream_process()
compression_stream_destroy()

可用于分块处理数据。)

但是,我尝试使用所有可用的数据解压缩您的数据 COMPRESSION_XXX 方法没有成功。

从我的实验看来,COMPRESSION_ZLIB 对应 到“原始放气”方法,即你用 zlib 得到什么 deflateInit2() 函数,如果设置了 windowBits 参数 为负值。

【讨论】:

  • 怎么知道缓冲区的大小要求?同样的事情,你怎么知道使用了压缩库中的哪些算法?借助流式方法,至少数据会自然增长。
  • @user965972 Lee Morgan 对此有一些想法:blog.shiftybit.net/2015/07/tinkering-with-compressionlib-part-3,他也有一个示例存储库:github.com/leemorgan/NSData-Compression
  • 博文的第 1 部分:“假设更高级别的调用者将保留此元数据。”因此,压缩数据并在其前面添加自定义元数据,包括文件大小。
  • 解压后的缓冲区应该有多大?我知道压缩数据的大小
  • @nadi9:不幸的是,没有提前计算解压缓冲区大小的函数,因此您只能在必要时增加缓冲区。 – 或者使用流媒体接口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2016-05-04
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多