2009-05-30 15 views
5

मैं कुछ ऐसा बना रहा हूं जिसमें फ़ाइल अपलोड सेवा शामिल है, और मुझे zlib के compress() फ़ंक्शन के साथ संपीड़ित डेटा स्टोर करने की आवश्यकता है। मैं इसे पहले से संपीड़ित इंटरनेट पर भेजता हूं, लेकिन मुझे दूरस्थ सर्वर पर असंपीड़ित फ़ाइल आकार को जानने की आवश्यकता है। क्या कोई तरीका है कि मैं इस जानकारी को पहले सर्वर पर डेटा को असम्पीडित() कर सकता हूं, केवल दक्षता के लिए? इस तरह मैं इसे अभी कर रहा हूं, लेकिन अगर कोई शॉर्टकट है तो मुझे इसे लेना अच्छा लगेगा।zlib में असम्पीडित डेटा का आकार प्राप्त करें?

वैसे, इसे असम्पीडित क्यों कहा जाता है? यह मेरे लिए बहुत भयानक लगता है, मैंने हमेशा सोचा कि यह डिकंप्रेस होगा ...

+1

मेरा अनुमान है कि इसे असम्पीड्रेस क्यों कहा जाता है, यह 90 के दशक के आरंभ में दिखाई देने वाले पीकेज़िप नामक प्रोग्राम की वजह से है। Pkunzip नामक एक अनुकरणीय कार्यक्रम था। मुझे लगता है कि "un" चारों ओर अटक गया। http://en.wikipedia.org/wiki/PKZIP – gradbot

+0

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

+0

आह-हा। दिलचस्प :) – AriX

उत्तर

3

उपयोग करने के लिए zlib प्रारूप मूल इनपुट आकार के लिए कोई फ़ील्ड नहीं है, इसलिए मुझे शक है आप डेटा के डिकंप्रेशन को सिम्युलेट किए बिना ऐसा करने में सक्षम होंगे। gzip format में "इनपुट आकार" (ISIZE) फ़ील्ड है, जिसका आप उपयोग कर सकते हैं, लेकिन हो सकता है कि आप संपीड़न प्रारूप को बदलने या क्लाइंट को फ़ाइल आकार भेजने से बचना चाहते हैं।

लेकिन यदि आप किसी भिन्न प्रारूप का उपयोग करते हैं, तो यदि आप ग्राहकों पर भरोसा नहीं करते हैं तो आपको यह भी सुनिश्चित करने के लिए एक अधिक महंगा चेक चलाने की आवश्यकता होगी कि असंपीड़ित डेटा क्लाइंट कहता है कि वह आकार है। इस मामले में, आप क्या कर सकते हैं असंपीड़ित करने के लिए/dev/null प्रक्रिया कम महंगी है, यह सुनिश्चित कर लें कि zlib आउटपुट डेटा कहीं भी नहीं लिखता है, क्योंकि आप केवल असम्पीडित आकार को जानना चाहते हैं।

+0

धन्यवाद। मैंने/dev/null को असम्पीडित करने का विचार नहीं किया था :) – AriX

4

मुझे शक है। मुझे विश्वास नहीं है कि यह कुछ अंतर्निहित zlib पुस्तकालय स्मृति से प्रदान करता है (हालांकि यह उपयोग करने के बाद से यह 7 या 8 साल का अच्छा रहा है, लेकिन अद्यतित दस्तावेज़ यह इंगित नहीं करते हैं कि यह सुविधा जोड़ा गया है)।

एक संभावना यह एक और फ़ाइल जो असंपीड़ित आकार निहित हस्तांतरण करने के लिए किया जाएगा (जैसे, file.zip और file.zip.size दोनों हस्तांतरण) लेकिन वह खतरे से भरा लगता है, खासकर यदि आप आकार गलत।

एक अन्य विकल्प, यदि सर्वर uncompressing समय महंगा है, लेकिन एक कम प्राथमिकता पृष्ठभूमि कार्य में यह करने के लिए तुरंत किया जाना करने के लिए नहीं है, (जैसे nice लिनक्स के तहत) के साथ है। लेकिन फिर, यदि आकार परीक्षक पीछे चलना शुरू कर देता है तो बहुत कम हो सकता है (बहुत सारे अपलोड आ रहे हैं)।

और मैं "में विस्फोटक विसंपीडन" के मामले में विसंपीड़न के बारे में सोच के लिए करते हैं, नहीं एक अच्छा अवधि :-)

+0

हाँ, मैं हमेशा सर्वर को बता सकता हूं कि आकार क्या है, लेकिन उपयोगकर्ता आसानी से इसका फायदा उठा सकते हैं, और मैं वास्तव में कुछ जटिल हैश जांच या कुछ भी नहीं करना चाहता हूं। – AriX

3

यदि आप कच्चे 'संपीड़ित' प्रारूप का उपयोग कर अपलोड कर रहे हैं, तो आपके पास अपलोड किए जा रहे डेटा के आकार पर जानकारी नहीं होगी। इस संबंध में पैक्स सही है।
आप संपीड़न बफर की शुरुआत में इसे 4 बाइट हेडर के रूप में स्टोर कर सकते हैं - यह मानते हुए कि फ़ाइल का आकार 4 जीबी से अधिक नहीं है।
एक उदाहरण के रूप में कुछ सी कोड:

uint8_t *compressBuffer = calloc(bufsize + sizeof (uLongf), 0); 
uLongf compressedSize = bufsize; 
*((uLongf *)compressBuffer) = filesize; 
compress(compressBuffer + sizeof (uLongf), &compressedSize, sourceBuffer, bufsize); 

तो फिर तुम आकार compressedSize + sizeof (uLongf) की पूरी compressBuffer भेजें। सही आकार को भेजने के लिए

// data is in compressBuffer, assume you already know compressed size. 
uLongf originalSize = *((uLongf *)compressBuffer); 
uint8_t *realCompressBuffer = compressBuffer + sizeof (uLongf); 

आप ग्राहक पर भरोसा नहीं करते हैं तो आप असम्पीडित किसी प्रकार का प्रदर्शन करने के लिए की आवश्यकता होगी: जब आप सर्वर साइड पर इसे प्राप्त आप डेटा वापस पाने के लिए निम्नलिखित कोड का उपयोग कर सकते सर्वर आकार पर डेटा जांच। असम्पीड्रेस/dev/null का उपयोग करने का सुझाव उचित है।
यदि आप एक .zip फ़ाइल अपलोड कर रहे हैं, तो इसमें एक निर्देशिका है जो आपको असम्पीडित होने पर फ़ाइल का आकार बताती है। यह जानकारी फ़ाइल प्रारूप में फिर से बनाई गई है, हालांकि यह दुर्भावनापूर्ण क्लाइंट के अधीन है।

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