क्या एक ऑन्लाइनर है जो एक बाइनरी फ़ाइल को छोटे एंडियन से बड़े एंडियन में परिवर्तित करता है?


14

और इसके विपरीत।

यदि प्रासंगिक हो तो मैं एक रेडहैट चला रहा हूं।


6
बाइनरी फ़ाइल किस प्रकार की है?
स्टीफन चेजलस

1
किसी भी मामले में, किसी भी फ़ाइल प्रारूप के लिए, मुझे यकीन है कि आप पर्ल और पैक / अनपैक का उपयोग करके अपने अंतरण को बदलने के लिए एक-लाइनर लिख सकते हैं । कुछ प्रारूपों के लिए, यह सिर्फ दूसरों की तुलना में लंबी लाइन होगी। ;-)
इल्मरी करोनन

जवाबों:


34

आप ऐसा नहीं कर सकते क्योंकि इस तरह के रूपांतरण के लिए, आपको द्विआधारी सामग्री का अर्थ जानने की आवश्यकता है।

अगर उदाहरण के लिए एक बाइनरी फ़ाइल के अंदर एक स्ट्रिंग है तो इसे परिवर्तित नहीं किया जाना चाहिए और एक 4 बाइट पूर्णांक को दो बाइट पूर्णांक से अलग उपचार की आवश्यकता हो सकती है।

दूसरे शब्दों में, बाइट ऑर्डर रूपांतरण के लिए, आपको डेटा प्रकार विवरण की आवश्यकता होती है।


7
मैं बस यही कह रहा था। यह उतना आसान नहीं है, जितना कि बाइट्स की हर जोड़ी को स्वैप करना है। उदाहरण के लिए बिगेंडियन में एक 4 बाइट पूर्णांक 01 02 03 04 छोटे एंडियन में इस तरह दिख सकते हैं 04 02 03 03 01 नहीं 02 01 04 03 cs.umd.edu/class/sum2003/cmsc311/Nata/Data/endian.html
Rob

1
सहमत, धीरज का कोई मतलब नहीं है एक कच्ची, टाइपलेस बाइट स्ट्रीम पर ... अगर ओपी अपने सवाल को संपादित नहीं करता है तो यह स्वीकृत उत्तर होना चाहिए
थॉमस

[उद्धरण वांछित] - AFAIK, जब तक कि कोई एप्लिकेशन स्पष्ट रूप से कुछ बाइट ऑर्डर को संरक्षित नहीं करता है और दूसरों को नहीं, तब बाइट्स या शब्दों को लगातार ऑर्डर करने के लिए सामान्य है।
अगली सूचना तक रोक दिया गया।

1
@ डेनिसविलियम्सन: यूटीएफ -8 या एएससीआईआई स्ट्रिंग में धीरज नहीं है। UTF-8 बाइट ऑर्डर को निर्दिष्ट करता है जबकि ASCII 7 बिट है और इसमें मल्टी-बाइट टोकन नहीं हैं। UTF-16 स्ट्रिंग में धीरज होता है और उस एंडियननेस को चिह्नित करने के लिए BOM नहीं हो सकता है या नहीं हो सकता है। एक यूनिक्स बाइनरी जिसका उद्देश्य विंडोज या जावा के साथ बातचीत करना है दोनों प्रकार के स्ट्रिंग हो सकते हैं, जिसका अर्थ है कि आपको कनवर्ट करते समय उन्हें अलग करना होगा।
केविन

मैं यहां एक कार्यक्रम की तलाश में आया था जहां आप इसे डेटा विवरण और डेटा देते हैं और इसे परिवर्तित करता है। इस प्रकार अब तक मुझे ऐसा कोई कार्यक्रम नहीं मिला है लेकिन इसका मतलब यह नहीं है कि यह नहीं किया जा सकता है।
लेवी मॉरिसन

32

आप के साथ बाइट्सवाप कर सकते हैं dd। क्या वह पर्याप्त है? यदि नहीं, तो कृपया इनपुट फ़ाइल और अपेक्षित आउटफाइल का उदाहरण देने के लिए अपने प्रश्न को अपडेट करें।

echo hello >infile
dd conv=swab <infile >outfile

hex infile
   0000 68 65 6c 6c 6f 0a                                 hello.
hex outfile
   0000 65 68 6c 6c 0a 6f                                 ehll.o

2

यदि आप फ़ाइल सामग्री के बारे में परवाह नहीं करते हैं और बस बाइट्स को स्वैप करना चाहते हैं, तो एंडकॉनव का प्रयास करें । यह मानक बाइट रूपांतरण कार्यों के आसपास सिर्फ एक आवरण है, इसलिए यह 2, 4 और 8 बाइट लंबे पूर्णांकों द्वारा रूपांतरण का समर्थन करता है। यह एक लाइनर नहीं है, क्योंकि यह अलग कार्यक्रम है।


0

फ़ाइल एंडियन बदलने के लिए, शब्द (32-बिट) आकार मानकर, यह 1 लाइनर आपके लिए काम करना चाहिए:

hexdump -v -e '1/4 "%08x"' -e '"\n"' input_file | xxd -r -p > output_file
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.