क्या बाइनरी डेटा के साथ मानक इनपुट और आउटपुट का उपयोग करना सुरक्षित है?


14

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


1
splitकमान पर एक नजर डालें ।
उदाहरण 11

जवाबों:


19

हां यह सुरक्षित है यदि आप इसे किसी अन्य प्रक्रिया में पाइप करते हैं या इसे किसी फ़ाइल में सहेजते हैं। संभावित "अजीबता" है यदि आप टर्मिनल पर बाइनरी स्टडआउट प्रिंट करते हैं क्योंकि इसमें एस्केप अनुक्रम (यादृच्छिक रूप से) हो सकते हैं जो अस्थायी रूप से टर्मिनल डिस्प्ले को गड़बड़ कर सकते हैं।


6
जिस स्थिति में आप resetइसे ठीक करने के लिए टाइप और एंटर दबा सकते हैं ।
बार्ड कोपरुडुड

4
@BaardKopperud मुझे लगा कि मैंने कुछ कोने के मामलों के बारे में कहीं पढ़ा है जहाँ परेशान / रीसेट काम नहीं करेगा
Xen2050

1
@ Xen2050 मुझे नहीं पता। एकमात्र मामला जो तब होता है जब कुछ एस्केप सीक्वेंस कीबोर्ड लेआउट / एन्कोडिंग को बदल देता है, ताकि टाइपिंग reset<enter> वास्तव में वर्णों के उस क्रम को टाइप न करे जैसा कि टर्मिनल द्वारा देखा गया है ...
बकुरीउ

3
बाइनरी फ़ाइल प्रदर्शित करने के बाद फिक्स टर्मिनल भी देखें और CTRL + C के बाद कंसोल को कभी-कभी रीसेट की आवश्यकता क्यों होती है । जैसा कि पहले लिंक में सुझाया गया है, stty sane; tput rs1कमांड का क्रम तब resetकाम करेगा जब काम न करने के कोने मामले हों । ऐसे मामलों में, बकुरीउ द्वारा उल्लिखित के अलावा, टर्मिनल लाइन / कॉलम की चौड़ाई शामिल हो सकती है या मैं धारावाहिक संचार (बॉड्रेट / समानता) से संबंधित सेटिंग्स का अनुमान लगा रहा हूं।
सर्गी कोलोडियाज़नी

1

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

यदि डेटा किसी भी तरह से संरचित है, तो आपको विभाजन बिंदुओं को चुनने में ध्यान रखना होगा ताकि आप बीच में संरचनाओं को न तोड़ें।

यदि आप फ़ाइल की संरचना जानते हैं, तो आप एक कमांड का उपयोग कर सकते हैं जैसे कि

dd -if input-file -of output-file ...

विकल्पों के साथ केवल एक विशिष्ट आकार के डेटा के इतने सारे खंडों को कॉपी करना (विशेष रूप से बढ़ा हुआ) फ़ाइल में ऑफसेट करना।

ऐसा लगता है कि splitजैसा कि @egmont द्वारा उल्लिखित कमांड आपके लिए इस प्रक्रिया को स्वचालित करेगा, लेकिन यह डिफ़ॉल्ट रूप से लाइन-ओरिएंटेड प्रतीत होता है, इसलिए आपको अतिरिक्त विकल्प निर्दिष्ट करना होगा जैसे --bytes countकि यह बताना है कि फ़ाइल का प्रत्येक टुकड़ा कितना बड़ा होना चाहिए हो।


एक साइड नोट के रूप में, यदि आप नहीं जानते कि एक फाइल में क्या है, लेकिन संदेह है कि इसमें कम से कम कुछ सार्थक पाठ्य डेटा शामिल हैं, तो stringsकमांड यह देखने का एक शानदार तरीका है कि आप क्या काम कर रहे हैं।

strings -n 6 file | less

प्रिंट करने योग्य पात्रों के सभी रन कम से कम छह वर्णों के मिलेंगे और उन्हें एक पेजर में प्रदर्शित किया जाएगा ताकि वे टर्मिनल पर उड़ान न भर सकें। 4 वर्णों के डिफ़ॉल्ट से थोड़ी बड़ी संख्या का उपयोग करने से डेटा के छोटे स्निपेट को समाप्त करने में मदद मिलती है जो कि केवल प्रिंट करने योग्य होते हैं, लेकिन फ़ाइल में उस तरह से उपयोग नहीं किए जा रहे हैं।

यदि आपको बाद में द्विआधारी संपादक जैसे अधिक विस्तार से फ़ाइल का पता लगाना है hexedit देखना है, तो आपके पास कुछ ऐसे स्थान होंगे जो इंगित करते हैं कि कुछ दिलचस्प मिल सकता है।

stringsएक विकल्प है - t x जो प्रत्येक मुद्रित स्ट्रिंग को हेक्साडेसिमल (ओ के लिए ओ में ओसेल / डी के लिए फ़ाइल में) के साथ प्रत्येक मुद्रित स्ट्रिंग को पूर्ववर्ती कर देगा, ताकि आप जान सकें कि बाद में इसे कहां खोजना है। यहां तक ​​कि बहुत कम फाइलें बहुत से निपटने के लिए हैं जब आपको उन्हें चरित्र द्वारा चरित्र को देखना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.