我有一个运行在Windows Azure上的Web服务,返回JSON数据供我的iPhone应用程序使用。
不幸的是,Windows Azure似乎还不支持动态响应的压缩(长话短说),所以我决定通过返回一个未压缩的JSON包含经过GZIP压缩的字符串来解决这个问题。
例如:
{"Error":null,"IsCompressed":true,"Success":true,"Value":"vWsAAB+LCAAAAAAAB..etc.."}
...其中的value是以JSON表示的一个复杂对象的压缩字符串。
在服务器上实现这个功能真的很容易,但我却无法想出如何将gzip压缩的NSString解压成未压缩的NSString,我能找到的所有关于zlib等的示例都是处理文件等。
有人可以给我一些提示吗?(如果使用deflate也可以,因为我可以更改服务器端的实现来使用deflate)
谢谢!
Steven
编辑1: 啊,我看到ASIHTTPRequest在其源代码中使用了以下函数:
//uncompress gzipped data with zlib
+ (NSData *)uncompressZippedData:(NSData*)compressedData;
我知道可以将NSString转换为NSData,所以我会尝试一下这个方法!
编辑2:不幸的是,编辑1中描述的方法并没有帮助我。
编辑3:根据下面有关base64编码/解码的建议,我编写了以下代码。 encodedGzippedString是一个字符串“Hello, my name is Steven Elliott”,它被压缩并转换为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);