我在 Windows Azure 上运行了一个 Web 服务,它返回我在 iPhone 应用程序中使用的 JSON。
不幸的是,Windows Azure 似乎还不支持动态响应的压缩(说来话长),所以我决定通过返回一个未压缩的 JSON 包来解决它,该包包含一个压缩(使用 GZIP)字符串。
例如
{"Error":null,"IsCompressed":true,"Success":true,"Value":"vWsAAB+LCAAAAAAAB..etc.."}
... 其中 value 是以 JSON 表示的复杂对象的压缩字符串。
这在服务器上很容易实现,但是对于我来说,我无法弄清楚如何将 gzip 压缩的 NSString 解压缩为未压缩的 NSString,我可以找到的 zlib 等所有示例都在处理文件等。
谁能给我有关如何执行此操作的任何线索?(我也很高兴使用 deflate 的解决方案,因为我可以将服务器端实现更改为也使用 deflate)。
谢谢!!
史蒂文
编辑 1:啊,我看到 ASIHTTPRequest 在其源代码中使用了以下函数:
//uncompress gzipped data with zlib
+ (NSData *)uncompressZippedData:(NSData*)compressedData;
...而且我知道我可以将 NSString 转换为 NSData,所以我会看看这是否会引导我到任何地方!
编辑 2:不幸的是,编辑 1 中描述的方法并没有引导我到任何地方。
编辑 3:按照以下关于 base64 编码/解码的建议,我想出了以下代码。你可以猜到,encodedGzippedString 是一个字符串“你好,我的名字是 Steven Elliott”,它被 gzip 压缩,然后转换为 base64 字符串。不幸的是,使用 NSLog 打印的结果只是空白。
NSString *encodedGzippedString = @"GgAAAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyK+uE6X2SJPiyZ93eaX+TI9Lcuiatvx/wOwYc0HGgAAAA==";
NSData *decodedGzippedData = [NSData dataFromBase64String:encodedGzippedString];
NSData* unGzippedJsonData = [ASIHTTPRequest uncompressZippedData:decodedGzippedData];
NSString* unGzippedJsonString = [[NSString alloc] initWithData:unGzippedJsonData encoding:NSASCIIStringEncoding];
NSLog(@"Result: %@", unGzippedJsonString);