swift gzip 数据到字符串问题

swift gzip data to string issue

我使用 gzip 库将 data 转换为 gzip data

如果我想从数据中获取字符串,我会这样做 String(data: data, encoding: .utf8)。但是,如果我对 gzip data 执行相同操作,我会得到 nil 字符串,因为据我所知,不可能将 gzip 数据转换为具有 .utf8 编码的字符串。

我需要那个,因为我想和服务器开发人员比较数据(因为他有时说我的数据格式不正确,但有时还可以,这很奇怪,因为我使用相同的库,而且我有想法这可能是服务器端的问题)。

有什么方法可以将 gzip 数据转换成任何字符串以便稍后比较吗?

如果这只是为了调试目的,那么我认为最快的方法是:

let myGZipNSData = myGZipData as! NSData //I wrote a "!" just for the sample)
print("myGZipNSData: \(myGZipNSData)")

它应该输出:

myGZipNSData: <5b226d79 41727261 7956616c 75653022 2c226d79 41727261 7956616c 75653122 5d>

这依赖于 NSData-description 方法打印“<hexValue>”。 不要依赖发布版本,几乎从不依赖 -description(是的,Apple 可以在下一个版本中更改 -description 的行为。它发生在不同的 class 上)。

其他方法(更安全)得到几乎相同的结果,你可以检查这个问题: 你得到相同的结果(几乎,更少 space,没有 </>) 和上一个一样。

其他方式:Base 64 使用 base64EncodedString() 方法 Data:

let base64Str = myGZipData?.base64EncodedString()
print("base64Str: \(base64Str!)")

输出:

base64Str: WyJteUFycmF5VmFsdWUwIiwibXlBcnJheVZhbHVlMSJd

现在,应该有其他方式: 有一个带有 Int 值的数组表示(在 0/255 之间而不是十六进制),但它似乎是为了调试目的所以检查你是否可以 "reproduce the current solutions" (working/fast 实现)我给你,并检查服务器开发人员 he/she 也可以在 his/her 方面进行比较。

注意: 出于本示例的目的,myGZipData 以这种方式构造:

let array = ["myArrayValue0", "myArrayValue1"]

let myGZipData = try? JSONSerialization.data(withJSONObject: array, options:[])

它不是真正的 GZipData,但目标是快速拥有一个 Data 对象 "big enough"。