2010-03-11 4 views
6

मैं एंड्रॉइड के लिए एक पायथन एप्लिकेशन पोर्ट कर रहा हूं और, किसी बिंदु पर, इस एप्लिकेशन को एक संपीड़ित डेटा भेजकर, एक वेब सेवा के साथ संवाद करना है।जावा (एंड्रॉइड) पर पाइथन और Deflater.deflate पर zlib.compress संगत है?

ताकि इसे अगली विधि का उपयोग करता है करने के लिए:

def stuff(self, data): 
    "Convert into UTF-8 and compress." 
    return zlib.compress(simplejson.dumps(data)) 

मैं अगली विधि का उपयोग कर रहा एंड्रॉयड में इस व्यवहार का अनुकरण करने की कोशिश करने के लिए:

private String compressString(String stringToCompress) 
{ 
    Log.i(TAG, "Compressing String " + stringToCompress); 
    byte[] input = stringToCompress.getBytes(); 
    // Create the compressor with highest level of compression 
    Deflater compressor = new Deflater(); 
    //compressor.setLevel(Deflater.BEST_COMPRESSION); 
    // Give the compressor the data to compress 
    compressor.setInput(input); 
    compressor.finish(); 
    // Create an expandable byte array to hold the compressed data. 
    // You cannot use an array that's the same size as the orginal because 
    // there is no guarantee that the compressed data will be smaller than 
    // the uncompressed data. 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(input.length); 
    // Compress the data 
    byte[] buf = new byte[1024]; 
    while (!compressor.finished()) 
    { 
     int count = compressor.deflate(buf); 
     bos.write(buf, 0, count); 
    } 

    try { 
     bos.close(); 
    } catch (IOException e) 
    { 

    } 
    // Get the compressed data 
    byte[] compressedData = bos.toByteArray(); 

    Log.i(TAG, "Finished to compress string " + stringToCompress); 

    return new String(compressedData); 
} 

लेकिन से HTTP प्रतिसाद सर्वर सही नहीं है और मुझे लगता है कि ऐसा इसलिए है क्योंकि जावा में संपीड़न का परिणाम पायथन में एक जैसा नहीं है।

मैंने zlib.compress और डिफ्लेट दोनों के साथ "ए" को संपीड़ित करने वाला एक छोटा परीक्षण चलाया।

अजगर, zlib.compress() -> x% 9CSJT% 02% 00% 01M% 00% ए 6

एंड्रॉयड, Deflater.deflate -> एच% एफई% BF% BDK% 04% 00% 00b % 00b

मुझे Python में zlib.compress() के समान मान प्राप्त करने के लिए एंड्रॉइड में डेटा को कैसे संपीड़ित करना चाहिए?

कोई भी मदद, मार्गदर्शन या सूचक की बहुत सराहना की जाती है!

+0

लाइन 'नई स्ट्रिंग (संपीड़ित डेटा) लौटाएं,' एक बग है। आप इस तरह स्ट्रिंग का उपयोग नहीं कर सकते हैं। –

उत्तर

2

हालांकि वे बिल्कुल वही एल्गोरिदम नहीं हैं, ऐसा लगता है कि वे पूरी तरह से संगत हैं (जिसका अर्थ है कि यदि आप संकुचित करते हैं, उदाहरण के लिए, Deflater.deflate का उपयोग करके एक स्ट्रिंग आप zlib का उपयोग करके इसे सही ढंग से असम्पीडित कर सकते हैं)।

मेरी समस्या यह थी कि पोस्ट में सभी फॉर्म चर से प्रतिशत बचने की आवश्यकता है, और एंड्रॉइड एप्लिकेशन ऐसा नहीं कर रहा था। इसे भेजने से पहले बेस 64 को डेटा एन्कोड करना, और ज़्लिब का उपयोग करके इसे असंप्रेषित करने से पहले बेस 64 का उपयोग करके इसे डीकोड करने के लिए सर्वर को संशोधित करना समस्या हल हो गई।

0

byte[] input = stringToCompress.getBytes("utf-8"); मदद करता है? यदि आपके प्लेटफ़ॉर्म का डिफ़ॉल्ट एन्कोडिंग यूटीएफ -8 नहीं है, तो यह यूटीएफ -8 का उपयोग करने के लिए एन्कोडिंग स्ट्रिंग -> बाइट्स को मजबूर करेगा। साथ ही, यह आपके कोड की आखिरी पंक्ति के लिए जाता है जहां आप new String बनाते हैं - आप डीटीओडीडी चार्सेट के रूप में यूटीएफ -8 को स्पष्ट रूप से निर्दिष्ट करना चाहते हैं।

+0

आपके सुझाव के लिए धन्यवाद! मैं इसे आज़माने जा रहा हूं और आपको बताता हूं कि यह कैसे जाता है और हालांकि मुझे लगता है कि डिफ़ॉल्ट एन्कोडिंग पहले ही यूटीएफ -8 सतर्क होने के लिए हमेशा अच्छा है। –

+0

मैं उस सुझाव का परीक्षण करता हूं लेकिन परिणाम नहीं बदलता। वैसे भी धन्यवाद! –

7

संपीड़न और डिफ्लेट अलग संपीड़न एल्गोरिदम हैं इसलिए उत्तर यह संगत नहीं होगा।

% binary encode hex [zlib compress a] 
789c4b040000620062 
% binary encode hex [zlib deflate a] 
4b0400

आपका अजगर कोड वास्तव में क्या कर रही है संपीड़ित: अंतर का एक उदाहरण के रूप में यहाँ 'एक' Tcl के माध्यम से दो एल्गोरिदम का उपयोग करते संकुचित है। और एंड्रॉयड कोड हवा निकालना कर रही है, फिर भी तुम भी UTF-8 बाइट क्रम चिह्न Android संस्करण के लिए prepended (\ XEF \ xbf \ xbf) हो रही है

आप डेटा हवा निकालना फेंकना अजगर का उपयोग कर सकते हैं:

def deflate(data): 
    zobj = zlib.compressobj(6,zlib.DEFLATED,-zlib.MAX_WBITS,zlib.DEF_MEM_LEVEL,0) 
    zdata = zobj.compress(data) 
    zdata += zobj.flush() 
    return zdata 
+0

मुझे संदेह है कि वे वास्तव में विभिन्न संपीड़न विधियां थे। अब मैं zlib के समान संपीड़न उत्पन्न करने के लिए एक तरीका देखने के लिए ध्यान केंद्रित कर सकता हूं।जावा में संपीड़ित (मैंने आपके पायथन कोड का परीक्षण किया और यह वास्तव में जावा संस्करण जैसे डेटा को डिफ्लेट करता है, लेकिन चूंकि मैं एंड्रॉइड पर एप्लिकेशन पोर्ट कर रहा हूं और मैं मूल को संशोधित नहीं कर सकता, मैं दूसरी तरफ देख रहा था: जावा पर संपीड़न करना)। वैसे भी, वास्तव में अब तक उपयोगी उत्तर! अगर मैं कर सकता तो मैं आपको वोट दूंगा: पी –

+0

+1 (अब मैं कर सकता हूं) –

संबंधित मुद्दे