2009-02-19 23 views
52

अनौपचारिक रूप से, हम में से अधिकांश समझते हैं कि 'बाइनरी' फ़ाइलें (ऑब्जेक्ट फ़ाइलें, छवियां, फिल्में, एक्जिक्यूटिव, मालिकाना दस्तावेज़ प्रारूप आदि) और 'टेक्स्ट' फ़ाइलें (स्रोत कोड, एक्सएमएल फाइलें, एचटीएमएल फाइलें, ईमेल इत्यादि) हैं। ।मैं 'बाइनरी' और 'टेक्स्ट' फ़ाइलों के बीच अंतर कैसे करूं?

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

हालांकि, विभिन्न उपकरण हैं जो फाइलों की एक विस्तृत श्रृंखला पर काम करते हैं, और व्यावहारिक रूप से, आप फ़ाइल को 'टेक्स्ट' या 'बाइनरी' के आधार पर कुछ अलग करना चाहते हैं। इसका एक उदाहरण कंसोल पर डेटा आउटपुट करने वाला कोई भी टूल है। सादा 'पाठ' ठीक लगेगा, और उपयोगी है। 'बाइनरी' डेटा आपके टर्मिनल को गड़बड़ कर देता है, और आमतौर पर देखने के लिए उपयोगी नहीं होता है। यह निर्धारित करते समय जीएनयू grep कम से कम इस भेद का उपयोग करता है कि क्या इसे कंसोल से आउटपुट आउटपुट करना चाहिए या नहीं।

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

उत्तर

11

हमारा सॉफ़्टवेयर कई बाइनरी फ़ाइल स्वरूपों के साथ-साथ टेक्स्ट फ़ाइलों को भी पढ़ता है।

हम पहले magic number के लिए पहले कुछ बाइट्स को देखते हैं जिन्हें हम पहचानते हैं। यदि हम किसी भी बाइनरी प्रकार के जादू संख्या को नहीं पढ़ते हैं, तो हम फ़ाइल के पहले 2 के बाइट्स को देख सकते हैं कि यह UTF-8, UTF-16 या वर्तमान code page में एन्कोड की गई एक टेक्स्ट फ़ाइल प्रतीत होता है मेजबान ऑपरेटिंग सिस्टम के। यदि यह इनमें से कोई भी परीक्षण पास नहीं करता है, तो हम मानते हैं कि यह ऐसी फ़ाइल नहीं है जिसे हम सौदा कर सकते हैं और उचित अपवाद फेंक सकते हैं।

+17

आप यह नहीं कहते कि "हमारा सॉफ्टवेयर" मानव पार्स को धीमा कर रहा है। – vwvan

4

ठीक है, अगर आप पूरी फाइल का निरीक्षण कर रहे हैं, तो देखें कि प्रत्येक चरित्र isprint(c) के साथ प्रिंट करने योग्य है या नहीं। यह यूनिकोड के लिए थोड़ा और जटिल हो जाता है।

यूनिकोड टेक्स्ट फ़ाइल, MSDN offers some great advice as to what to do को अलग करने के लिए।

यह का सार पहले पहले चार बाइट तक निरीक्षण करने के लिए है:

EF BB BF  UTF-8 
FF FE  UTF-16, little endian 
FE FF  UTF-16, big endian 
FF FE 00 00 UTF-32, little endian 
00 00 FE FF UTF-32, big-endian 

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

+0

केवल कि इस नियम का उपयोग फ़ाइलों के लिए काम करता है। –

+0

ठीक है अगर यह उन नियमों का पालन नहीं करता है तो यह वास्तव में एक टेक्स्ट फ़ाइल नहीं है। एमबीसी के अलावा, लेकिन यह एक पूरी तरह से अलग कहानी है। – MSN

+3

UTF-8 फ़ाइलें करने के लिए एक बीओएम prepending यूनिकोड मानक द्वारा प्रोत्साहित नहीं कर रहा है, और यह एक दया है कि वे इसे सिरे से मना नहीं करते। साथ ही, उन अन्य प्रारूपों में एक के पास असफल नहीं है। – Deduplicator

2

अधिकांश कार्यक्रमों है कि बताने के लिए अंतर ऐसी फ़ाइल की पहली n बाइट्स की जांच और अगर उन बाइट्स सभी या नहीं के रूप में 'पाठ' अर्हता देखकर (जैसा कि अनुमान का उपयोग करें, कोशिश यानी, वे सब गिरावट करना प्रिंट करने योग्य ASCII charcters की सीमा के भीतर)। बेहतर विकृति के लिए यूनिक्स-जैसी प्रणालियों पर हमेशा 'फ़ाइल' कमांड होता है।

60

आप file कमांड का उपयोग कर सकते हैं। यह फ़ाइल (man file) पर परीक्षण का एक गुच्छा करता है यह तय करने के लिए कि यह बाइनरी या टेक्स्ट है या नहीं। यदि आप सी से ऐसा करने की ज़रूरत है तो आप इसके स्रोत कोड को देख/उधार ले सकते हैं।

file README 
README: ASCII English text, with very long lines 

file /bin/bash 
/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped 
+0

+1 यदि यह एक लिनक्स सिस्टम है, तो फाइल आपके द्वारा बनाई गई किसी भी चीज़ की तुलना में बेहतर हेरिस्टिक है। –

+0

हाँ, अगर फ़ाइल उपलब्ध है, तो यह नौकरी के लिए सबसे अच्छा उपकरण होगा। कोई प्रश्न नहीं! इसके अलावा 'फ़ाइल-आई' एक साफ चाल है। मैंने अपनी विशेष समस्या के लिए खोलने का विचार नहीं किया था, हालांकि मुझे नहीं लगता कि मैं प्रदर्शन ओवरहेड को रोक सकता हूं। धन्यवाद! – benno

10

आप

file --mime 
लिनक्स पर MacOS (टिप्पणी देखें) पर

आशुलिपि है file -i और file -I (राजधानी i) के साथ फ़ाइल के MIME type निर्धारित कर सकते हैं।

यदि यह text/ से शुरू होता है, तो यह टेक्स्ट, अन्यथा बाइनरी है। एक्सएमएल अनुप्रयोगों का एकमात्र अपवाद है। आप फ़ाइल प्रकार के अंत में +xml की तलाश करके उनसे मिलान कर सकते हैं।

+0

मुझे लगता है कि "फ़ाइल-आई" (ऊपरी मामला) होना चाहिए। कम से कम मेरे परीक्षण और मैन पेज के अनुसार। – benno

+1

बस इसे देखा, डेबियन और gentoo लिनक्स में निचला मामला सही है। उनकी फ़ाइल ftp है http://ftp.astron.com/pub/file/file-5.00.tar.gz (या एक अलग संस्करण)। -आई (ऊपरी) न तो एक विकल्प है। – phihag

+0

हू, अजीब। ओएस एक्स (4.17) का संस्करण -आई (ऊपरी) का उपयोग करता है और मेरे लिनक्स बॉक्स (4.24) पर एक -i (निचला) उपयोग करता है। कितना परेशान! मुझे आश्चर्य है कि यह एक ओएस एक्स-आईएसएम है, या लेखकों ने बस बिंदु रिलीज के बीच इंटरफेस बदल दिया। – benno

1

एक साधारण जांच यह है कि यदि \0 वर्ण हैं। टेक्स्ट फाइलों में उन्हें नहीं है।

+9

जब तक यह utf-16, या utf32 नहीं है। तो बहुत कुछ है। – Breton

1

जैसा कि पहले बताया गया था * निक्स ऑपरेटिंग सिस्टम में फ़ाइल कमांड के भीतर यह क्षमता है। यह आदेश एक विन्यास फाइल का उपयोग करता है जो कई लोकप्रिय फ़ाइल संरचनाओं में निहित जादू संख्या को परिभाषित करता है।

यह फ़ाइल जिसे जादू कहा जाता है ऐतिहासिक रूप से/etc में संग्रहीत किया गया था, हालांकि यह कुछ वितरणों में/usr/share में हो सकता है। जादू फ़ाइल फ़ाइल के भीतर मौजूद मानों के ऑफसेट को परिभाषित करती है और फिर फ़ाइल के प्रकार को निर्धारित करने के लिए इन स्थानों की जांच कर सकती है।

संरचना और जादू फ़ाइल का वर्णन प्रासंगिक मैनुअल पृष्ठ (आदमी जादू)

एक कार्यान्वयन के लिए के रूप में परामर्श करके पाया जा सकता है, अच्छी तरह से है जो अपने आप file.c भीतर पाया जा सकता है, तथापि फ़ाइल के संबंधित भाग आदेश है कि निर्धारित करता है यह पठनीय पाठ है या नहीं निम्नलिखित

/* Make sure we are dealing with ascii text before looking for tokens */ 
    for (i = 0; i < nbytes - 1; i++) { 
     if (!isascii(buf[i]) || 
      (iscntrl(buf[i]) && !isspace(buf[i]) && 
      buf[i] != '\b' && buf[i] != '\032' && buf[i] != '\033' 
      ) 
      ) 
      return 0; /* not all ASCII */ 
    } 
3

पर्ल एक सभ्य अनुमानी है। बाइनरी के परीक्षण के लिए -B ऑपरेटर का उपयोग करें (और उसके विपरीत, -T टेक्स्ट के परीक्षण के लिए)। यहाँ के पाठ फ़ाइलों को सूचीबद्ध करने के एक एक लाइनर शैल:

$ find . -type f -print0 | perl -0nE 'say if -f and -s _ and -T _' 

(ध्यान दें कि एक पूर्ववर्ती डॉलर के बिना उन अंडरस्कोर सही हैं (RTFM)।)

2

इसका एक पुराने विषय, लेकिन शायद किसी को इस उपयोगी मिलेगा । आप एक स्क्रिप्ट में तय करने के लिए अगर कुछ एक फाइल तो आप बस इस तरह कर सकते हैं हैं:

if file -i $1 | grep -q text; 
then 
. 
. 
fi 

इस फ़ाइल प्रकार मिल जाएगा, और एक मूक ग्रेप साथ आप एक पाठ करता है, तो अपने तय कर सकते हैं।

+0

OSX इस के लिए दो वेरिएंट हैं: लोअरकेस मैं वर्गीकरण (जैसे, फ़ाइल, निर्देशिका) के बिना प्रकार प्रिंट होगा; अपरकेस- मैं वर्गीकरण मुद्रित करूंगा, जैसा कि आप लिनक्स सिस्टम पर अपेक्षा करेंगे। आप उस प्लेटफ़ॉर्म पर काम करने के लिए अपरकेस-I का उपयोग करना चाहेंगे – verboze

0

आप libmagic का उपयोग कर सकते हैं जो यूनिक्स file कमांड लाइन का लाइब्रेरी संस्करण है।

0

फूल करने के लिए:

कई भाषाओं के लिए आवरण हैं वर्तमान dir/उपनिर्देशिका में टी पाठ फ़ाइल नाम:

$ grep -rIl '' 

बाइनरी:

$ grep -rIL '' 

विशेष फ़ाइल की जाँच करने के लिए, थोड़ा आदेश को संशोधित:

$ grep -qI '' FILE 

तो, बाहर निकलें स्थिति '0' होगा मतलब फाइल एक पाठ है; '1' - बाइनरी। जाँच की जा सकी:

$ $ गूंज?

+0

यह समाधान समाधान है। कृपया, downvote कारण की व्याख्या, शायद मैं इस सवाल का जवाब किसी भी तरह – bam

+0

में सुधार करना चाहिए मैं dd द्वारा और नैनो द्वारा उत्पन्न फ़ाइलों पर यह परीक्षण किया गया। आपकी विधि बहुत अच्छी काम करती है। मुझे भी दिलचस्पी है कि वोट क्यों कम किए गए थे। – Daniel

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