2011-05-19 12 views
21

मेरे पास एक सी/सी ++ प्रोग्राम है जिसे फ़ाइल में पढ़ने की आवश्यकता है जो संकुचित gzip हो सकता है या नहीं। मुझे पता है कि हम संकुचित और असम्पीडित फ़ाइलों दोनों में पढ़ने के लिए zlib से gzread() का उपयोग कर सकते हैं - हालांकि, मैं केवल zlib फ़ंक्शंस का उपयोग करना चाहता हूं अगर फ़ाइल gzip संपीड़ित है (प्रदर्शन कारणों से)।कैसे जांचें कि फ़ाइल gzip संपीड़ित है या नहीं?

तो प्रोग्रामिंग रूप से पता लगाने या जांचने का कोई तरीका है कि कोई निश्चित फ़ाइल सी/सी ++ से gzipped है या नहीं?

+1

@ रोब केनेडी: असम्पीडित फ़ाइलों के लिए 1min (फ़्रेड) बनाम 20 मिनट (gzread) बहुत बड़ा अंतर है। ज़्लिब के पुराने संस्करण का उपयोग करके हमारे साथ ऐसा करना पड़ सकता है, लेकिन अभी मैं नवीनतम संस्करण का उपयोग करने की स्थिति में नहीं हूं - इसलिए सशर्त पढ़ने को करना है। –

उत्तर

42

फ़ाइल की शुरुआत में एक जादू संख्या है। बस पहले दो बाइट पढ़ें और जांचें कि क्या वे 0x1f8b के बराबर हैं।

+28

एंडियननेस और बाइट चौड़ाई से सावधान रहें। एक समग्र के बजाय व्यक्तिगत मानों की तुलना करें: '(बाइट 1 == 0x1f) && (byte2 == 0x8b) 'बनाम first2bytes == 0x1f8b' बनाम। – pmg

+0

@pmg: सिर के लिए धन्यवाद। :) –

1

आप एक विचार प्राप्त करने के लिए आरएफसी 1 9 51 और 1952 में वर्णित हस्ताक्षरों का परीक्षण कर सकते हैं। जीजेआईपी फाइलों के लिए दूसरा एक प्रासंगिक है और यह निश्चित है। अन्य प्रारूपों पर कुछ झूठे सकारात्मक हैं, इसलिए आपको मूल्यवान मानों के लिए अधिकतर शीर्षलेख की जांच करनी चाहिए।

केवल zlib धाराओं के लिए यह कुछ कठिन है, क्योंकि वे झूठी सकारात्मकताओं के लिए भी अधिक प्रवण हैं। लेकिन आप शायद ही कभी जंगली में उन लोगों से मुकाबला करेंगे।

3

gzread() का उपयोग कर संकुचित और असम्पीडित फ़ाइलों को पढ़ने के बीच प्रदर्शन में अंतर क्या है?

वैसे भी, यह पता लगाने के लिए कि फ़ाइल को gzipped किया गया है, आप फ़ाइल की शुरुआत में magic number पढ़ सकते हैं, जो 1f 8b लिंक के अनुसार है।

+0

प्रदर्शन के संबंध में: असम्पीडित फ़ाइलों के लिए 1min (फ्रेड) बनाम 20 मिनट (gzread) बहुत बड़ा अंतर है। ज़्लिब के पुराने संस्करण का उपयोग कर हमारे साथ ऐसा करना पड़ सकता है, लेकिन अभी मैं नवीनतम संस्करण का उपयोग करने की स्थिति में नहीं हूं - इसलिए इसके आसपास काम करने के लिए सशर्त पढ़ने को करना है। –

8

क्या आप झूठी सकारात्मक, झूठी नकारात्मक, या कोई झूठी नतीजे पसंद करते हैं (नाली के नीचे प्रदर्शन चला जाता है ...)?

RFC 1952: GZIP file format specification version 4.3 फ़ाइल के पहले 2 बाइट्स (प्रत्येक सदस्य का और इसलिए) '\x1F' और '\x8B' बताता है। उस पहली जांच के लिए इसका उपयोग करें जिसके परिणामस्वरूप झूठी सकारात्मक हो सकती है।

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