我有一个在Windows Azure上运行的Web服务,它返回我在iPhone应用程序中使用的JSON .
不幸的是,Windows Azure似乎还不支持动态响应的压缩(长篇故事)所以我决定通过返回一个未压缩的JSON包来解决它,它包含一个压缩的(使用GZIP)字符串 .
例如
{"Error":null,"IsCompressed":true,"Success":true,"Value":"vWsAAB+LCAAAAAAAB..etc.."}
...其中value是以JSON表示的复杂对象的压缩字符串 .
这在服务器上很容易实现,但是对于我的生活,我无法弄清楚如何将压缩的NSString解压缩为未压缩的NSString,我可以为zlib等找到的所有示例都处理文件等 .
谁能给我任何关于如何做到这一点的线索? (我也很乐意使用deflate的解决方案,因为我可以更改服务器端实现以使用deflate) .
谢谢!!
史蒂芬
Edit 1: 啊,我看到ASIHTTPRequest在它的源代码中使用了以下函数:
//uncompress gzipped data with zlib
+ (NSData *)uncompressZippedData:(NSData*)compressedData;
...而且我知道我可以将NSString转换为NSData,所以我会看到这是否会引导我到任何地方!
Edit 2: 不幸的是,编辑1中描述的方法并没有把我带到任何地方 .
Edit 3: 按照以下关于base64编码/解码的建议,我想出了以下代码 . 您可以猜测encodedGzippedString是一个字符串"Hello, my name is 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);
3 回答
经过这么久,我终于找到了解决这个问题的方法!
上面的答案都没有帮助我,因为他们看起来都很有希望 . 最后,我能够使用chilkat框架为.net来压缩服务器上的字符串...然后使用chilkat框架在iOS上解压缩它(尚未发布,但如果您通过电子邮件发送,则可用直接) .
chilkat框架让这个非常容易对开发人员大加赞赏!
您的“压缩”字符串不是原始GZIP数据,它在某些编码中允许这些字节存储在字符串中 - 看起来像base-64或类似的东西 . 要从中获取NSData,您需要将其解码为NSData .
如果它真的是基础-64,请查看此博客文章附带的代码:http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html,它将做你想要的 .
一旦你有了一个NSData对象,ASIHTTPRequest方法可能会按你的意愿去做 .
这对我有用:从字符串gzipeed,然后base64编码到un-gzipped字符串(所有utf8) .