swift gzip数据到字符串的问题



我使用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>

这依赖于打印"<hexValue>"的NSData-description方法。在发布版本上不要依赖它,几乎永远不要依赖-description(是的,苹果可以在下一个版本中改变-description的行为。它发生在另一个类上)。

其他方法(更安全)可以得到几乎相同的结果,你可以检查这个问题:如何在swift中将数据转换为十六进制字符串,你会得到与前一个相同的结果(几乎,更少的空间,没有</>)。

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

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

输出:

base64Str: WyJteUFycmF5VmFsdWUwIiwibXlBcnJheVZhbHVlMSJd

现在,应该有其他方法:有一个Int值(在0/255之间,而不是十六进制)的数组表示,但它似乎是为了调试目的,所以请检查您是否可以"重现我给您的当前解决方案"(有效/快速实现),并与服务器开发人员一起检查他/她能做些什么来进行比较。

注:为了这个样本的目的,myGZipData是这样构建的:

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

它并不是一个真正的GZipData,但目标是快速拥有一个"足够大"的Data对象。

最新更新