سؤال

لديّ خدمة ويب تعمل على Windows Azure والتي تُرجع JSON التي أستهلكها في تطبيق iPhone الخاص بي.

لسوء الحظ ، لا يبدو أن Windows Azure يدعم ضغط الاستجابات الديناميكية حتى الآن (القصة الطويلة) لذلك قررت الالتفاف عليها من خلال إعادة حزمة JSON غير مضغوطة ، والتي تحتوي على سلسلة مضغوطة (باستخدام GZIP).

على سبيل المثال

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

... حيث القيمة هي السلسلة المضغوطة لكائن معقد ممثل في JSON.

كان هذا سهل التنفيذ على الخادم ، لكن على مدى حياة لي ، لا يمكنني معرفة كيفية فك ضغط NSString المغطى بـ Gzipped في NSString غير مضغوط ، كل الأمثلة التي يمكنني العثور عليها لـ ZLIB وما إلى ذلك تتعامل مع الملفات وما إلى ذلك.

هل يمكن لأي شخص أن يعطيني أي أدلة حول كيفية القيام بذلك؟ (سأكون سعيدًا أيضًا بحل يستخدم Deflate حيث يمكنني تغيير تطبيق جانب الخادم لاستخدام Deflate أيضًا).

شكرًا!!

ستيفن

تحرير 1: Aaah ، أرى أن Asihtprequest يستخدم الوظيفة التالية في رمز المصدر:

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

... وأنا أدرك أنه يمكنني تحويل NSString إلى NSData ، لذلك سأرى ما إذا كان هذا يقودني إلى أي مكان!

تحرير 2: لسوء الحظ ، فإن الطريقة الموضحة في التحرير 1 لم تقودني إلى أي مكان.

تحرير 3: باتباع النصيحة أدناه فيما يتعلق بترميز/فك التشفير BASE64 ، توصلت إلى الرمز التالي. إن encodedGzippedString كما يمكنك تخمين ، سلسلة "مرحبًا ، اسمي ستيفن إليوت" الذي تم تحويله إلى سلسلة 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);  
هل كانت مفيدة؟

المحلول

بعد كل هذا الوقت ، وجدت أخيرًا حلاً لهذه المشكلة!

لم تساعدني أي من الإجابات المذكورة أعلاه ، كما واعدة كما نظروا جميعًا. في النهاية ، تمكنت من ضغط السلسلة على الخادم باستخدام GZIP باستخدام إطار chilkat لـ .NET ... ثم فك ضغطها على iPhone باستخدام إطار chilkat لنظام iOS (لم يتم إصداره بعد ، ولكن متاح إذا قمت بإرسال بريد إلكتروني إلى البريد الإلكتروني الرجل مباشرة).

جعل إطار Chilkat هذا سهلًا للغاية للقيام بإبهام كبير حتى المطور!

نصائح أخرى

سلسلة "مضغوطة" ليست بيانات gzip'd الخام ، إنها في بعض الترميز التي تسمح بتخزين تلك البايتات في سلسلة-تبدو مثل 64 أو شيء من هذا القبيل. للحصول على NSDATA من هذا ، ستحتاج إلى فك تشفيره في NSDATA.

إذا كان الأمر أساسيًا-64 ، تحقق من نشر المدونة هذا الرمز المصاحب:http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.htmlالذي سيفعل ما تريد.

بمجرد أن يكون لديك كائن NSDATA ، من المحتمل أن تفعل طريقة ASIHTPREQUEST كما تريد.

لقد نجح هذا الأمر بالنسبة لي: من سلسلة Gzipeed ، ثم Base64 مشفرة على سلسلة غير مجهزة (كل 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top