我有一个Web服务在Windows Azure上运行的返回JSON,我在我的iPhone应用程序消耗。
不幸的是,Windows Azure的似乎不支持的动态响应的压缩,但(长的故事),所以我决定返回一个未压缩的JSON包,其中包含一个压缩(使用GZIP)字符串绕过它。
如
{"Error":null,"IsCompressed":true,"Success":true,"Value":"vWsAAB+LCAAAAAAAB..etc.."}
...其中值是在JSON表示的复合物的压缩字符串。
这是很容易在服务器上实现,但对我的生活我无法弄清楚如何将gzip压缩的NSString解压缩到一个未压缩的NSString,所有的例子我能找到的zlib等正在处理的文件等。
谁能给我如何做到这一点任何线索? (我也很乐意为使用的放气,因为我可以改变服务器端执行使用紧缩上的解决方案)。
谢谢!!
史蒂芬
编辑1:啊哈,我看到ASIHTTPRequest使用下面的功能,在它的源代码如下:
//uncompress gzipped data with zlib
+ (NSData *)uncompressZippedData:(NSData*)compressedData;
...和我知道,我的NSString转换为NSData的,所以我会看,如果这在任何地方使我!
编辑2:不幸的是,在编辑1所描述的方法并没有导致我到任何地方。
编辑3:按照下面就base64编码/解码的建议,我想出了下面的代码。 该encodedGzippedString是你可以猜测,一个字符串“你好,我的名字叫史蒂芬艾略特”,这是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);
毕竟这一次,我终于找到了解决这个问题!
答案都不上面帮我,是有希望的,因为他们都期待。 最后,我能够压缩与使用.NET奇尔卡特框架gzip的服务器上的串...然后使用适用于iOS(尚未发布奇尔卡特框架iphone解压,但如果你的电子邮件可用人直接)。
奇尔卡特框架使这个超级容易做到这么大的竖起大拇指给开发者!
您的“压缩”字符串不是原始数据gzip压缩,它在一些编码,使这些字节存储在一个string--看起来像基地-64或类似的东西。 为了得到一个NSData了这一点,你需要将它解码成NSData的。
如果它真的基地-64,看看这个博客文章附带的代码: http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html这将做你想做的。
一旦你有一个NSData对象时,ASIHTTPRequest方法可能会做如你所愿。
这为我工作:从一个字符串gzipeed,然后base64编码到非gzip压缩串(所有UTF8)。
#import "base64.h"
#import "NSData+Compression.h"
...
+(NSString *)gunzipBase64StrToStr:(NSString *)stringValue {
//now we decode from Base64
Byte inputData[[stringValue lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];//prepare a Byte[]
[[stringValue dataUsingEncoding:NSUTF8StringEncoding] getBytes:inputData];//get the pointer of the data
size_t inputDataSize = (size_t)[stringValue length];
size_t outputDataSize = EstimateBas64DecodedDataSize(inputDataSize);//calculate the decoded data size
Byte outputData[outputDataSize];//prepare a Byte[] for the decoded data
Base64DecodeData(inputData, inputDataSize, outputData, &outputDataSize);//decode the data
NSData *theData = [[NSData alloc] initWithBytes:outputData length:outputDataSize];//create a NSData object from the decoded data
//NSLog(@"DATA: %@ \n",[theData description]);
//And now we gunzip:
theData=[theData gzipInflate];//make bigger==gunzip
return [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
}
@end