在 Swift 5 on macOS/iPhone 中压缩的数据无法通过其他任何方式解压缩

Data compressed in Swift 5 on macOS/iPhone cannot be decompressed by anything else

我正在尝试使用 NSData 实例方法 .compressed(using: .zlib). Note .zlib is the format recommended by Apple for portability.

Python 3 的 zlib 库(在 macOS 12.2 或 Ubuntu Linux 21.10 上)或命令行 uncompress(在 macOS 上)。

问题: 我如何在 Apple 的 Swift 中的其他 devices/not 上解压缩此数据?

这是一个基本示例,可以将其放入 compressor.swift 和 compiled/run 以生成压缩数据,紧随 this guide

import Foundation

struct SomeThing: Codable {
  var thing: String
  
  init(thing: String) {
    self.thing = thing
  }
}

let thing = SomeThing(thing: "abc")

let encoder = JSONEncoder()

let encodedThing = try encoder.encode(thing)

let compressedEncodedThing = try (encodedThing as NSData).compressed(using: .zlib)

try compressedEncodedThing.write(to: URL(fileURLWithPath: "/path/to/somewhere/abc.Z"),
                                 options: [])

在 macOS 上的编译和 运行 按预期生成 abc.Z

这段代码会解压我们刚才写的文件,只要我们在macOS上编译即可:

import Foundation

let readBytes = try! Data(contentsOf: URL(fileURLWithPath: "/path/to/somewhere/abc.Z"))

let decompressed = try! (readBytes as NSData).decompressed(using: .zlib) as Data

let decompString = String(decoding: decompressed, as: UTF8.self)

print(decompString) // prints {"thing": "abc"}

在 Linux 上尝试同样的事情(Ubuntu 21.10 和 Swift 5.5.3 发布工具链),

$ swiftc decompressor.swift 
decompressor.swift:5:47: error: value of type 'NSData' has no member 'decompressed'
let decompressed = try! (readBytes as NSData).decompressed(using: .zlib) as Data
                        ~~~~~~~~~~~~~~~~~~~~~ ^~~~~~~~~~~~
decompressor.swift:5:68: error: cannot infer contextual base in reference to member 'zlib'
let decompressed = try! (readBytes as NSData).decompressed(using: .zlib) as Data

这表明开源 NSData 缺少它在 Apple hardware/OS.

上的一些方法

我尝试过的其他强烈建议未使用真正的 ZLib 编码的东西:

您的数据似乎是原始压缩流。在 python 你可以试试 zlib.decompress(bytesRead, wbits=-15).