压缩/解压缩的NSS​​tring在目标c(iphone)使用GZIP或放气压缩/解压缩的NSS​​

2019-05-12 05:41发布

我有一个Web服务在Windows Azure上运行的返回JSON,我在我的iPhone应用程序消耗。

不幸的是,Windows Azure的似乎不支持的动态响应的压缩,但(长的故事),所以我决定返回一个未压缩的JSON包,其中包含一个压缩(使用GZIP)字符串绕过它。

{"Error":null,"IsCompressed":true,"Success":true,"Value":"vWsAAB+LCAAAAAAAB..etc.."}

...其中值是在JSON表示的复合物的压缩字符串。

这是很容易在服务器上实现,但对我的生活我无法弄清楚如何将gzip压缩的NSS​​tring解压缩到一个未压缩的NSS​​tring,所有的例子我能找到的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);  

Answer 1:

毕竟这一次,我终于找到了解决这个问题!

答案都不上面帮我,是有希望的,因为他们都期待。 最后,我能够压缩与使用.NET奇尔卡特框架gzip的服务器上的串...然后使用适用于iOS(尚未发布奇尔卡特框架iphone解压,但如果你的电子邮件可用人直接)。

奇尔卡特框架使这个超级容易做到这么大的竖起大拇指给开发者!



Answer 2:

您的“压缩”字符串不是原始数据gzip压缩,它在一些编码,使这些字节存储在一个string--看起来像基地-64或类似的东西。 为了得到一个NSData了这一点,你需要将它解码成NSData的。

如果它真的基地-64,看看这个博客文章附带的代码: http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html这将做你想做的。

一旦你有一个NSData对象时,ASIHTTPRequest方法可能会做如你所愿。



Answer 3:

这为我工作:从一个字符串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


文章来源: Compress/Decompress NSString in objective-c (iphone) using GZIP or deflate