2010-06-10 10 views
8

मैं एक वेब सेवा विंडोज Azure पर चल रहा है जो JSON है कि मैं अपने iPhone एप्लिकेशन में उपभोग देता है।कम्प्रेस/उद्देश्य-सी में दबाव हटाना NSString (iPhone) GZIP या हवा निकालना का उपयोग कर

दुर्भाग्यवश, विंडोज़ एज़ूर गतिशील प्रतिक्रियाओं के संपीड़न का समर्थन करने के लिए प्रतीत नहीं होता है (लंबी कहानी) इसलिए मैंने एक असम्पीडित JSON पैकेज लौटाकर इसे चारों ओर पाने का फैसला किया, जिसमें संकुचित (GZIP का उपयोग करके) स्ट्रिंग शामिल है।

, उदा,

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

... जहां मूल्य एक जटिल JSON में प्रतिनिधित्व वस्तु की संकुचित स्ट्रिंग है।

यह सर्वर पर कार्यान्वित करना वास्तव में आसान था, लेकिन मेरे जीवन के लिए मैं एक असम्पीडित एनएसएसटींग में एक gzipped एनएसएसटींग को डिकंप्रेस करने का तरीका नहीं समझ सकता, मैं zlib आदि के लिए जो भी उदाहरण पा सकता हूं, वे फाइलों से निपट रहे हैं आदि

क्या कोई मुझे यह कैसे करने के बारे में कोई संकेत दे सकता है? (मैं ऐसे समाधान के लिए भी खुश हूं जो डिफ्लेट का उपयोग करता है क्योंकि मैं भी सर्वर-साइड कार्यान्वयन को डिफ्लेट का उपयोग करने के लिए बदल सकता हूं)।

धन्यवाद !!

स्टीवन

संपादित करें 1: आह, मुझे लगता है कि ASIHTTPRequest उस में निम्नलिखित समारोह का उपयोग कर रहा है स्रोत कोड:

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

... और मुझे पता है कि मैं NSString परिवर्तित कर सकते हैं कर रहा हूँ एनएसडाटा के लिए, तो मैं देखता हूं कि यह मुझे कहीं भी ले जाता है!

संपादित करें 2: दुर्भाग्यवश, संपादन 1 में वर्णित विधि ने मुझे कहीं भी नेतृत्व नहीं किया।

संपादित करें 3: बेस 64 एन्कोडिंग/डिकोडिंग के संबंध में नीचे दी गई सलाह के बाद, मैं निम्नलिखित कोड के साथ आया। एन्कोडेड GzippedString जैसा कि आप अनुमान लगा सकते हैं, एक स्ट्रिंग "हैलो, मेरा नाम स्टीवन इलियट है" जिसे gzipped किया गया है और फिर बेस 64 स्ट्रिंग में परिवर्तित किया गया है। दुर्भाग्य से, परिणाम जो एनएसएलओजी का उपयोग कर प्रिंट करता है वह खाली है।

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

इस समय के बाद, मुझे अंततः इस समस्या का समाधान मिला!

जवाब में से कोई भी ऊपर मुझे मदद की, होनहार के रूप में के रूप में वे सब देखा।अंत में, मैं सर्वर पर स्ट्रिंग को .net के लिए चिल्काट फ्रेमवर्क का उपयोग करके gzip के साथ संपीड़ित करने में सक्षम था ... और उसके बाद आईओएस के लिए चिलकट फ्रेमवर्क का उपयोग करके इसे आईफोन पर डिकंप्रेस करें (अभी तक जारी नहीं किया गया है, लेकिन अगर आप ईमेल करते हैं तो उपलब्ध लड़का सीधे)।

चिल्काट ढांचे ने डेवलपर को इतने बड़े अंगूठे करने के लिए यह सुपर आसान बना दिया!

+0

हाय, क्या आप ढांचे के लिए कोई सटीक लिंक प्रदान कर सकते हैं? –

+0

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

+0

चिल्काट ढांचे का उपयोग कैसे करें? –

1

आपका "संकुचित" स्ट्रिंग, कच्चे GZIP'd डेटा नहीं है, यह कुछ एन्कोडिंग उन बाइट्स एक string-- में संग्रहित किया जा करने की अनुमति देता है कि में है आधार-64 या यह की तरह कुछ की तरह लग रहा है। इसमें से एनएसडेटा प्राप्त करने के लिए, आपको इसे एनएसडीटा में डीकोड करना होगा।

यदि यह वास्तव में बेस -64 है, तो इस ब्लॉग को एक साथ कोड पोस्ट करें: http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html जो आप चाहते हैं वह करेगा।

बार जब आप एक NSData वस्तु है, ASIHTTPRequest विधि शायद के रूप में आप की तरह कर सकते हैं।

+0

हाय क्विक्सोटो, आपकी प्रतिक्रिया के लिए धन्यवाद। यदि आप मेरी मूल पोस्ट में संपादन 3 की जांच करते हैं, तो आप देखेंगे कि मैंने आपकी सलाह का उपयोग करके कुछ और करने की कोशिश की थी। धन्यवाद फिर से –

+0

यह चरणों का एक उचित सेट है, इसलिए स्पष्ट नहीं है: प्रेषित स्ट्रिंग निश्चित रूप से बेस 64 है? (शायद) विंडोज़ भूमि में मूल स्ट्रिंग का मूल एन्कोडिंग क्या है? आप डीकोड पर एक ASCII एन्कोडिंग चुन रहे हैं, जो सही होने की संभावना नहीं है। क्या एनएसडीटा बफर में डेटा बिल्कुल बता रहा है? –

0

यह मेरे लिए काम करता है: स्ट्रिंग gzipeed से, तो बेस 64 एन्कोडेड 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 
संबंधित मुद्दे