2010-06-10 40 views
8

Tôi có một dịch vụ web chạy trên Windows Azure trả về JSON mà tôi sử dụng trong ứng dụng iPhone của mình. Thật không may, Windows Azure dường như không hỗ trợ nén phản hồi động (câu chuyện dài) vì vậy tôi quyết định đi xung quanh nó bằng cách trả về một gói JSON không nén, có chứa một chuỗi nén (sử dụng GZIP).Nén/giải nén NSString trong mục tiêu-c (iphone) bằng GZIP hoặc giảm phát

ví dụ

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

... nơi giá trị là chuỗi nén của một đối tượng phức tạp đại diện trong JSON. Điều này thực sự dễ thực hiện trên máy chủ, nhưng đối với cuộc sống của tôi, tôi không thể tìm ra cách giải nén một NSString được nén vào một NSString không nén, tất cả các ví dụ tôi có thể tìm kiếm cho zlib vv là xử lý các tệp v.v.

Có ai cho tôi bất kỳ manh mối nào về cách thực hiện việc này không? (Tôi cũng sẽ được hạnh phúc cho một giải pháp sử dụng deflate như tôi có thể thay đổi việc thực hiện phía máy chủ để sử dụng deflate quá).

Cảm ơn !!

Steven

Sửa 1: Aaah, tôi thấy rằng ASIHTTPRequest đang sử dụng các chức năng sau đây trong đó là mã nguồn:

//uncompress gzipped data with zlib 
+ (NSData *)uncompressZippedData:(NSData*)compressedData; 

... và tôi biết rằng tôi có thể chuyển đổi NSString để NSData, vì vậy tôi sẽ xem nếu điều này dẫn tôi bất cứ nơi nào!

Chỉnh sửa 2: Rất tiếc, phương pháp được mô tả trong Chỉnh sửa 1 không dẫn tôi đến bất kỳ đâu.

Chỉnh sửa 3: Làm theo lời khuyên dưới đây về mã hóa/giải mã base64, tôi đã đưa ra mã sau. EncodedGzippedString là như bạn có thể đoán, một chuỗi "Xin chào, tên tôi là Steven Elliott" được gzipped và sau đó chuyển đổi thành chuỗi base64. Thật không may, kết quả in bằng NSLog chỉ là trống.

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); 

Trả lời

3

Sau tất cả thời gian này, cuối cùng tôi đã tìm được giải pháp cho vấn đề này!

Không có câu trả lời nào ở trên đã giúp tôi, như đầy hứa hẹn khi tất cả đều được xem xét.Cuối cùng, tôi đã có thể nén chuỗi trên máy chủ bằng gzip bằng cách sử dụng khung chilkat cho .net ... và sau đó giải nén nó trên iphone bằng cách sử dụng khung công cụ chilkat cho iOS (chưa được phát hành, nhưng có sẵn nếu bạn gửi email cho anh chàng trực tiếp).

Khuôn khổ chilkat làm điều này siêu dễ dàng để làm như vậy ngón tay cái lớn lên đến các nhà phát triển!

+0

Xin chào, Bạn có thể cung cấp bất kỳ liên kết chính xác nào đến khung công tác không? –

+0

http://www.chilkatsoft.com/downloads_ios.asp – dirkoneill

+0

cách sử dụng khung chilkat? –

1

Chuỗi "nén" của bạn không phải là dữ liệu GZIP'd thô, trong một số mã hóa cho phép các byte đó được lưu trữ trong chuỗi - trông giống như base-64 hoặc giống như vậy. Để có được một NSData trong số này, bạn sẽ cần phải giải mã nó vào NSData.

Nếu nó thực sự là base-64, hãy xem bài đăng trên blog này kèm theo mã: http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html sẽ thực hiện những gì bạn muốn.

Khi bạn có đối tượng NSData, phương pháp ASIHTTPRequest có thể sẽ làm như bạn muốn.

+0

Hi Quixoto, Cảm ơn phản hồi của bạn. Nếu bạn kiểm tra chỉnh sửa 3 trong bài viết gốc của tôi, bạn sẽ thấy những gì đã xảy ra sau khi tôi đã thử một số chi tiết bằng cách sử dụng lời khuyên của bạn. Cảm ơn một lần nữa –

+0

Đó là một bộ các bước hợp lý, vì vậy điều không rõ ràng là: chuỗi được truyền đi chắc chắn Base64? (có thể) Mã hóa ban đầu của chuỗi gốc trong Windows là gì? Bạn đang chọn mã hóa ASCII trên giải mã, điều này có vẻ không chính xác. Dữ liệu trong bộ đệm NSData có nói gì không? –

0

Điều này làm việc cho tôi: từ chuỗi gzipeed, sau đó base64 được mã hóa thành chuỗi chưa được nén (tất cả 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 
Các vấn đề liên quan