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"。
我使用 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 上)。
其他方法(更安全)得到几乎相同的结果,你可以检查这个问题:<
/>
) 和上一个一样。
其他方式: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"。