2011-07-22 13 views
13

पर स्ट्रिंग को हेक्साडेसिमल में कनवर्ट करें मैं हेक्सडेसिमल में "हैलो" को 48 65 6c 6c 6f में कमांड लाइन का उपयोग करके जितनी संभव हो सके कुशलतापूर्वक रूपांतरित करने की कोशिश कर रहा हूं।कमांड लाइन

मैंने printf और Google को देखने का प्रयास किया है, लेकिन मुझे कहीं भी नहीं मिल सकता है।

किसी भी मदद की बहुत सराहना की।

अग्रिम में बहुत धन्यवाद,

+0

क्या ऑपरेटिंग सिस्टम? बहुत सी "कमांड लाइनें" हैं ... – Nemo

+0

क्या आपने यहां देखा है: http://www.commandlinefu.com/commands/view/6066/convert-ascii-string-to-hex और यहां: http: // stackoverflow.com/questions/2103698/dos-command-to-format-string-to-hex-value? – Mrchief

+0

@ नीमो मैं उबंटू लिनक्स पर हूं ... – Eamorr

उत्तर

30
echo -n "Hello" | od -A n -t x1 

स्पष्टीकरण:

  • echo कार्यक्रम अगले आदेश के लिए स्ट्रिंग प्रदान करेगा।
  • -n ध्वज "हैलो" के अंत में एक नई लाइन उत्पन्न न करने के लिए गूंज बताता है।
  • od प्रोग्राम "ऑक्टल डंप" प्रोग्राम है। (हम इसे ऑक्टल के बजाय हेक्साडेसिमल में डंप करने के लिए एक ध्वज प्रदान करेंगे।)
  • -A n ध्वज --address-radix=n के लिए छोटा है, जिसमें "कोई नहीं" के लिए छोटा है। इस भाग के बिना, कमांड बाईं ओर एक बदसूरत संख्यात्मक पता उपसर्ग का उत्पादन करेगा। यह बड़े डंप के लिए उपयोगी है, लेकिन एक छोटी स्ट्रिंग के लिए यह अनावश्यक है।
  • -t x1 ध्वज --format=x1 के लिए छोटा है, x "हेक्साइडसिमल" और 1 अर्थ 1 बाइट के लिए छोटा है।
+0

अरे, यह वास्तव में अच्छी तरह से काम करता है। क्या आप किसी भी मौके से रिक्त स्थान से छुटकारा पाने के तरीके के बारे में जानते हैं ??? – Eamorr

+2

echo -n "हैलो" | od -A n -t x1 | sed's/^ * // ' – TMS

+0

मेरा मानना ​​है कि आपका मतलब गूंज-एन "हैलो" | od -A n -t x1 | sed's/* // g ' – ndvo

1

जाहिर है, @ टीएमएस आरटीएफएम नहीं कर सकता है। आप यह करते हैं और रिक्त स्थान की जरूरत को निकालना चाहते हैं (अपने पिछले जवाब देने के लिए अपनी टिप्पणी देखें)

:

echo -n "Hello" | od -A n -t x1 | sed 's/ *//g' 

पहले दो पाइप लाइन में आदेशों में अच्छी तरह से अपने जवाब में @TMS से समझाया जाता है, @ जेम्स द्वारा संपादित के रूप में। अंतिम आदेश @ टीएमएस टिप्पणी से अलग है कि यह दोनों सही है और परीक्षण किया गया है। स्पष्टीकरण है:

  • sed एक रों tream एड itor है।
  • ss ubstitute कमांड है।
  • / एक नियमित अभिव्यक्ति खुलता है - किसी भी चरित्र का उपयोग किया जा सकता है। / परंपरागत है, लेकिन प्रसंस्करण, कहने, एक्सएमएल या पथ नाम के लिए असुविधाजनक है।
  • / या आपके द्वारा चुने गए वैकल्पिक चरित्र, नियमित अभिव्यक्ति को बंद कर देते हैं और प्रतिस्थापन स्ट्रिंग खोलता है।
  • / */* पिछले वर्ण के किसी अनुक्रम से मेल खाता है (इस मामले में, एक स्थान)।
  • / या आपके द्वारा चुने गए वैकल्पिक चरित्र, प्रतिस्थापन स्ट्रिंग को बंद कर देता है। इस मामले में, प्रतिस्थापन स्ट्रिंग // खाली है, यानी मैच हटा दिया गया है।
  • g इस प्रतिस्थापन जी प्रत्येक लाइन पर प्रत्येक पंक्ति के लिए के बजाय प्रत्येक पंक्ति पर लॉबली करने का विकल्प है।
  • उद्धरण पार्सर को भ्रमित होने से रोकते हैं - पूरे अनुक्रम sed को पहले विकल्प के रूप में पास किया जाता है, अर्थात् sed स्क्रिप्ट।

@TMS मस्तिष्क बच्चे (sed 's/^ *//') केवल प्रत्येक पंक्ति की शुरुआत से रिक्त स्थान स्ट्रिप्स (^ पंक्ति के आरंभ से मेल खाता है - sed -speak में 'पैटर्न अंतरिक्ष')।

आप अतिरिक्त नई-पंक्तियों को निकालना चाहते हैं, सबसे आसान तरीका है संलग्न करने के लिए

| tr -d '\n' 
आदेश पाइप

है। यह निम्नानुसार कार्य करता है:

  • | इस कमांड के मानक इनपुट में पहले संसाधित स्ट्रीम को फ़ीड करता है।
  • trtr anslate कमांड है।
  • -d मिलान वर्णों को हटाने का निर्दिष्ट करता है।
  • उद्धरण आपके मिलान वर्णों की सूची - इस मामले में केवल नई लाइन (\n)। अनुवाद केवल एकल अक्षरों से मेल खाता है, अनुक्रम नहीं।

sed न्यूलाइन से निपटने के दौरान विशिष्ट रूप से मंद हो जाता है। ऐसा इसलिए है क्योंकि sed सबसे पुराने unix कमांडों में से एक है - यह लोगों को वास्तव में पता था कि वे क्या कर रहे थे इससे पहले बनाया गया था। व्यापक विरासत सॉफ्टवेयर इसे ठीक होने से रोकता है। मुझे यह पता है क्योंकि मेरा जन्म unix से पहले हुआ था।

समस्या की ऐतिहासिक उत्पत्ति यह विचार थी कि एक नई लाइन रेखा रेखा का हिस्सा नहीं है, रेखा का हिस्सा नहीं है। इसलिए इसे लाइन प्रोसेसिंग यूटिलिटीज द्वारा अलग किया गया था और आउटपुट यूटिलिटीज द्वारा पुन: सम्मिलित किया गया था। समस्या यह है कि यह उपयोगकर्ता डेटा की संरचना के बारे में धारणा बनाता है और कई सेटिंग्स में अप्राकृतिक प्रतिबंध लगाता है। sed की आसानी से न्यूलाइन को हटाने में असमर्थता उस विकृत विचारधारा के सबसे आम उदाहरणों में से एक है जो दुःख का कारण बनती है।

यह sed साथ नई-पंक्तियों को दूर करने के लिए संभव है - यह है कि अभी सब समाधान के बारे में मैं sed प्रक्रिया पूरी फ़ाइल एक ही बार में, जो बहुत बड़ी फ़ाइलों के लिए chokes बनाने पता, एक धारा संपादक के प्रयोजन को पराजित किया। कोई भी समाधान जो लाइन प्रोसेसिंग को बरकरार रखता है, यदि यह संभव हो, तो कई पाइपों का एक अपठनीय चूहे का घोंसला होगा।

आप sed कोशिश का उपयोग कर पर जोर देते हैं:

sed -z 's/\n//g' 

-zsed बताता लाइन विभाजक के रूप में उपयोग करने के लिए nulls।

आंतरिक रूप से, C में एक स्ट्रिंग को शून्य के साथ समाप्त कर दिया गया है। -z विकल्प विरासत का भी परिणाम है, C प्रोग्रामर की सुविधा के रूप में प्रदान किया गया है जो C -strings से भरे अस्थायी फ़ाइल का उपयोग करना चाहेंगे और न्यूलाइन द्वारा अनचाहे।फिर वे एक समय में एक स्ट्रिंग को आसानी से पढ़ और संसाधित कर सकते हैं। फिर, उपयोग मामलों के बारे में प्रारंभिक धारणा उपयोगकर्ता डेटा पर कृत्रिम प्रतिबंध लगाती है।

यदि आप g विकल्प को छोड़ देते हैं, तो यह आदेश केवल पहली नई पंक्ति को हटा देता है। -z विकल्प sed पूरी फ़ाइल को एक पंक्ति के रूप में व्याख्या करता है (जब तक कि फ़ाइल में एम्बेडेड भटकने वाले नल होते हैं), जिसे शून्य से समाप्त किया जाता है और इसलिए यह बड़ी फ़ाइलों पर भी चोक करता है।

आप सोच सकते हैं

sed 's/^/\x00/' | sed -z 's/\n//' | sed 's/\x00//' 

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

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

इस दृष्टिकोण को काम करने के लिए, आपको अंतिम आदेश पर g विकल्प की आवश्यकता है, इसलिए, यह बड़ी फ़ाइलों पर चोक करता है।

नीचे की रेखा यह है: न्यूलाइन को संसाधित करने के लिए sed का उपयोग न करें।

+0

ओएमजी आप बहुत बढ़िया हैं ... – TMS