在 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 编码的东西:
- 打电话
uncompress abc.Z
(来自生成 abc.Z
的同一台 macOS 计算机)returns
uncompress: abc.Z: Inappropriate file type or format
我也尝试过使用 gunzip
来处理类似的失败消息。
- 在 Python 中尝试了
zlib.decompress
3. Python 失败可能是最有用的信息:此脚本因错误 error: Error -3 while decompressing data: incorrect header check
而崩溃
import zlib
with open("/path/to/somewhere/abc.Z", "rb") as f:
bytesRead = f.read()
decompressed = zlib.decompress(bytesRead)
print(decompressed)
- 文件的前 20 个字节(十六进制)是:
$ od -x -N 20 abc.Z
0000000 56ab c92a ccc8 574b 52b2 4c4a 564a 05aa
0000020 0000
0000021
您的数据似乎是原始压缩流。在 python 你可以试试 zlib.decompress(bytesRead, wbits=-15)
.
我正在尝试使用 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 编码的东西:
- 打电话
(来自生成uncompress abc.Z
abc.Z
的同一台 macOS 计算机)returns
我也尝试过使用uncompress: abc.Z: Inappropriate file type or format
gunzip
来处理类似的失败消息。 - 在 Python 中尝试了
zlib.decompress
3. Python 失败可能是最有用的信息:此脚本因错误error: Error -3 while decompressing data: incorrect header check
而崩溃import zlib with open("/path/to/somewhere/abc.Z", "rb") as f: bytesRead = f.read() decompressed = zlib.decompress(bytesRead) print(decompressed)
- 文件的前 20 个字节(十六进制)是:
$ od -x -N 20 abc.Z 0000000 56ab c92a ccc8 574b 52b2 4c4a 564a 05aa 0000020 0000 0000021
您的数据似乎是原始压缩流。在 python 你可以试试 zlib.decompress(bytesRead, wbits=-15)
.