首页 文章

使用GZIP或deflate在objective-c(iphone)中压缩/解压缩NSString

提问于
浏览
8

我有一个在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 回答

  • 0

    经过这么久,我终于找到了解决这个问题的方法!

    上面的答案都没有帮助我,因为他们看起来都很有希望 . 最后,我能够使用chilkat框架为.net来压缩服务器上的字符串...然后使用chilkat框架在iOS上解压缩它(尚未发布,但如果您通过电子邮件发送,则可用直接) .

    chilkat框架让这个非常容易对开发人员大加赞赏!

  • 4

    您的“压缩”字符串不是原始GZIP数据,它在某些编码中允许这些字节存储在字符串中 - 看起来像base-64或类似的东西 . 要从中获取NSData,您需要将其解码为NSData .

    如果它真的是基础-64,请查看此博客文章附带的代码:http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html,它将做你想要的 .

    一旦你有了一个NSData对象,ASIHTTPRequest方法可能会按你的意愿去做 .

  • 1

    这对我有用:从字符串gzipeed,然后base64编码到un-gzipped字符串(所有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
    

相关问题