हेक्सडंप बनाम xxd प्रारूप अंतर


9

मैं खोज रहा था कि कैसे एक रिवर्स हेक्सडंप किया जाए और xxd का उल्लेख किया जाए। हालांकि, यह बस के साथ काम करने के लिए प्रतीत नहीं होता है:

xxd -r hexdumpfile > binaryfile

मैं तो के आउटपुट के बीच अंतर की तुलना में xxd infileऔर hexdump infile, और तीन मतभेद पाया:

  1. xxd आउटपुट में पते के बाद एक कोलन होता है
  2. xxd आउटपुट में डेटा उलट दिए गए हैं (उदाहरण के लिए, 5a42xxd आउटपुट में हेक्सडंप आउटपुट हो जाता 425aहै)
  3. प्रत्येक पंक्ति के बाद कुछ अतिरिक्त वर्ण हैं

मेरे पास सर्वर पर केवल कुछ फ़ाइलों का हेक्सडंप्लड संस्करण है। मैं xxd का उपयोग करके बाइनरी डेटा को सही ढंग से कैसे वापस ले सकता हूं?


Xxd में हेक्सडम्प प्रारूप में लेने के लिए किसी विकल्प की तलाश कर रहा था, लेकिन अभी के लिए, यह कुछ सरल सेड ऑपरेशंस के साथ करने में कामयाब रहा
tanon

मैंने वास्तव में ठीक से परीक्षण नहीं किया है कि आप क्या पूछते हैं, लेकिन कोशिश करें xxd -p और -b, -p सादा -b द्विआधारी है, साथ ही साथ -r भी। बाइट ऑर्डर के अनुसार, जो बड़े एंडियन और छोटे एंडियन के साथ करना होगा, और शायद xxd इसे उल्टा नहीं कर सकता है .. लेकिन यह संबंधित है कि बाइट फ़ाइल में कैसे संग्रहीत हैं। यदि आपके पास नोटपैड में एक पाठ फ़ाइल है, तो , आप इसे यूनिकोड 16-बिट बड़े एंडियन, या छोटे एंडियन या UTF-8 या जो भी हो, के रूप में सहेज सकते हैं, और आप xxd से अंतर देखते हैं। ओड कमांड इसे अलग तरीके से प्रदर्शित कर सकता है।
बार्लॉप

भविष्य के संदर्भ के लिए, hexdumpआप इसके आउटपुट में उपयोग की जाने वाली एंडियननेस को चुनने की अनुमति देते हैं, जिससे यह सरल हो सके। (अब क्यों? आपका प्रश्न असंबंधित किसी चीज के लिए मददगार पाया गया।)
jpaugh

जवाबों:


7

ऐसा कोई आदेश नहीं है जो मुझे पता है कि रूपांतरण करेगा, लेकिन इसे आसानी से कुछ चरणों में तोड़ा जा सकता है:

  1. hexdumpआउटपुट से स्ट्रिप एड्रेस का उपयोग करsed
  2. बाइनरी का उपयोग करके परिवर्तित करें xxd
  3. एंडियन रूपांतरण (उदाहरण के लिए, 5a42बन जाता है 425a) का उपयोग करनाdd

यहाँ पूरी आज्ञा है:

sed 's/^[0-9]*//' hexdump | xxd -r -p | dd conv=swab of=binaryfile

अगर हेक्सडंप 0a के साथ समाप्त नहीं होता है
Smeterlink

1

यह उत्तर https://stackoverflow.com/a/52834021/6770384 से क्रॉस-पोस्ट है

आप एक sedकमांड में रूपांतरण कर सकते हैं । यह :पते के बाद जोड़ने और एंडियननेस (स्विचिंग ) में बदलने के ab12लिए पर्याप्त है 12ab

sed -E 's/ /: /;s/ (..)(..)/ \2\1/g;$d' dump | xxd -r

ज्ञात कीड़े (टिप्पणी अनुभाग देखें)

  • मूल फ़ाइल विषम लंबाई (जैसे 1, 3, 5, 7, ..., बाइट लंबी) की थी, तो एक अनुगामी नल बाइट जोड़ा जाता है।
  • यदि वे hexdumpएड का उपयोग कर  रहे थे, तो मूल फ़ाइल के दोहराए गए खंडों को सही ढंग से बहाल नहीं किया गया है *

अगर हेक्सडंप 0a के साथ समाप्त नहीं होता है
Smeterlink

@Smeterlink इस अवलोकन के लिए धन्यवाद! आप सही हैं: यह कमांड एक अनुगामी नल बाइट पैदा करता है जो मूल फ़ाइल में नहीं था यदि बाइट्स में लंबाई एक विषम संख्या थी। मुझे एक और बग भी मिला। hexdumpएक का उपयोग कर दोहराया भागों को छिपा सकते हैं *। यह आदेश भी इन भागों को सही ढंग से पुनर्स्थापित नहीं कर सकता है। उदाहरण: 100 के बजाय yes | head -n100 | hexdump | sed -E 's/ /: /;s/ (..)(..)/ \2\1/g' | xxd -rकेवल 8 प्रिंट करता है। yइन चीजों को ठीक करने के लिए इस एक-लाइनर से अधिक की आवश्यकता होगी। शायद मैं भविष्य में एक और स्क्रिप्ट जोड़ूं।
सोकोवी

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