2011-12-21 15 views
8

मैं एक ज़िप फ़ाइल में पहली केंद्रीय निर्देशिका फ़ाइल शीर्षलेख की स्थिति खोजने की कोशिश कर रहा हूं।एक ज़िप फ़ाइल में केंद्रीय निर्देशिका की स्थिति कैसे खोजें?

मैं इन पढ़ रहा हूँ: http://en.wikipedia.org/wiki/Zip_(file_format) http://www.pkware.com/documents/casestudies/APPNOTE.TXT

मैं इसे देखना रूप में, मैं केवल पिन डेटा के माध्यम से स्कैन कर सकते हैं, हैडर अनुभाग की किस तरह मैं पर हूँ द्वारा की पहचान है, और फिर जब तक ऐसा मैंने केंद्रीय निर्देशिका शीर्षलेख मारा। मैं स्पष्ट रूप से उस फ़ाइल हेडर को पढ़ता हूं और वास्तविक डेटा को छोड़ने के लिए "संपीड़ित आकार" का उपयोग करता हूं, और फ़ाइल में प्रत्येक बाइट के माध्यम से फॉर-लूप नहीं ...

यदि मैं ऐसा करता हूं, तो मैं व्यावहारिक रूप से ज़िप फ़ाइल के अंदर पहले से ही सभी फाइलों और फ़ोल्डर्स को जानते हैं, इस मामले में मुझे अब केंद्रीय निर्देशिका के लिए अधिक उपयोग नहीं दिख रहा है।

मेरी समझ के लिए

केंद्रीय निर्देशिका के प्रयोजन फ़ाइल मेटाडाटा, और ज़िप फ़ाइल में वास्तविक डेटा की स्थिति सूची ताकि आप पूरी फ़ाइल को स्कैन करने की जरूरत नहीं होगी है?

केंद्रीय निर्देशिका रिकॉर्ड के अंत के बारे में पढ़ने के बाद, विकिपीडिया का कहना है:

यह आदेश एक ज़िप फ़ाइल एक पास में बनाए जा सकते हैं, लेकिन यह आमतौर पर पहली पर केंद्रीय निर्देशिका पढ़कर decompressed है समाप्त।

मुझे केंद्रीय निर्देशिका रिकॉर्ड का अंत आसानी से कैसे मिलेगा? हमें याद रखना होगा कि इसमें एक मनमानी आकार की टिप्पणी हो सकती है, इसलिए मुझे नहीं पता कि डेटा स्ट्रीम के अंत से कितने बाइट्स स्थित हैं। क्या मैं बस इसे स्कैन करता हूं?

पीएस मैं एक ज़िप फ़ाइल पाठक लिख रहा हूँ।

+0

आप अंत (ज़िप निर्देशिका फ़ाइल के अंत में स्थित है) से पीछे की ओर स्कैनिंग शुरू नहीं कर सकते? –

+1

हां मैं कर सकता हूं, लेकिन क्या यह वास्तव में आपको ऐसा करने का तरीका है?केंद्रीय निर्देशिका के अंत को खोजने के लिए पीछे की ओर स्कैनिंग एक संभावना है, लेकिन इस तथ्य पर विचार करते हुए कि इसमें आकार 16-बिट्स का एक परिवर्तनीय आकार का टिप्पणी क्षेत्र है, तो आपके पास लगभग 65k टिप्पणियां हो सकती हैं जिन्हें आपको पढ़ने/स्कैन करने की आवश्यकता है, और यदि टिप्पणी में जादू स्कैनिंग आपकी स्कैनिंग विफल हो जाएगी। – Tower

+0

टिप्पणियां सबसे अधिक खाली होती हैं और आज 64 के क्या है? –

उत्तर

1

मैं बाइट्स छोर से शुरू के माध्यम से पाशन समाप्त हो गया। लूप बंद हो जाता है अगर यह एक मिलान बाइट अनुक्रम पाता है, तो सूचकांक शून्य से नीचे है या यदि यह पहले से ही 64k बाइट्स के माध्यम से चला गया है। अंत में

+0

क्या आपको समाधान मिला? केंद्रीय निर्देशिका कैसा दिखता है? मेरे पास बेस 64 एन्कोडेड फ़ाइल है। –

8

प्रारंभ और शुरुआत की दिशा में स्कैन, निर्देशिका हस्ताक्षर के अंत की तलाश में और बाइट्स आप स्कैन किया की संख्या की गणना। जब आप उम्मीदवार पाते हैं, टिप्पणी लंबाई (एल) के लिए बाइट 20 ऑफ़सेट प्राप्त करें। जांचें कि एल +20 आपकी वर्तमान गिनती से मेल खाता है या नहीं। फिर जांचें कि केंद्रीय निर्देशिका की शुरूआत (बाइट 12 ऑफसेट द्वारा इंगित) के पास उचित हस्ताक्षर है।

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

+1

इस उत्तर के लिए धन्यवाद डेरेक, वास्तव में इसकी सराहना करते हैं –

+0

यह भी उल्लेख किया जाना चाहिए कि 'endOfFile - 22' स्थिति से शुरू करना सबसे अच्छा है, क्योंकि इस स्थिति के बाद केंद्रीय निर्देशिका हस्ताक्षर का वास्तविक अंत नहीं हो सकता है। खाली टिप्पणियों वाले अभिलेखागार के लिए, इसे पहले पुनरावृत्ति पर हस्ताक्षर मिलेगा। – Mark

+0

मैंने endOfFile -22 पर जांच की, अगर यह विफल हो जाता है तो endOfFile - 64k - 22 और endopfile -22 तक लूप का प्रयास करें, जब भी मैं हस्ताक्षर देखता हूं तो इस हेरिस्टिक चेक को लागू करता है। जिज्ञासा के लिए यहां कोड: https://github.com/paulsapps/msgi/blob/840857346a84efc0b29ae00edb0b693b805ae4f1/Source/MgsLib/Fs.cpp#L323 – paulm

1

बस अपनी उंगलियों को पार करें और उम्मीद करें कि 06054 बी 50 के रूप में सीआरसी, टाइमस्टैम्प या डेटास्टैम्प के साथ कोई प्रविष्टि नहीं है, या 06054B50 होने वाले चार बाइट्स का कोई अन्य अनुक्रम नहीं है।

+3

मुझे सच में नहीं लगता कि यह इस प्रश्न के लिए बहुत ही रचनात्मक है। एक टिप्पणी के रूप में बेहतर जोड़ा गया होगा। –

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