2012-10-31 14 views
18

में एएससीआई में कनवर्ज़न हेक्स स्ट्रिंग में मेरे पास बहुत सारी स्ट्रिंग है और मैं इसे एसीआईआई में बदलने के लिए एक कमांड खोजना चाहता हूं, मैंने echo -e और od के साथ प्रयास किया, लेकिन यह काम नहीं किया।बैश कमांड लाइन

0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2 
+0

यह ASCII जैसा नहीं दिखता है। ASCII को 0x7f से अधिक मानों के लिए परिभाषित नहीं किया गया है। –

+0

क्या आपका मतलब बाइनरी है? – Kerby82

+0

क्या आप एएससीआईआईआई के बजाय int/बाइनरी का मतलब है? आपके द्वारा दिखाए गए मान ASCII श्रेणी से अधिक हैं ... –

उत्तर

12

इस कोड को बराबर मूल्यों के साथ 11 बाइट्स की एक धारा में पाठ 0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2 परिवर्तित कर देंगे। ये बाइट मानक आउट करने के लिए लिखे जाएंगे।

TESTDATA=$(echo '0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2' | tr '.' ' ') 
for c in $TESTDATA; do 
    echo $c | xxd -r 
done 

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

यह कैसे काम करता है: xxd -r बाइनरी में हेक्साडेसिमल डेटा का अनुवाद करता है (एक रिवर्स हेक्सडम्प की तरह)। xxd की आवश्यकता है कि प्रत्येक पंक्ति लाइन पर पहले अक्षर की इंडेक्स संख्या से शुरू हो (कुछ पर हेक्सडम्प चलाएं और देखें कि प्रत्येक पंक्ति इंडेक्स नंबर से कैसे शुरू होती है)। हमारे मामले में हम चाहते हैं कि वह संख्या हमेशा शून्य हो, क्योंकि प्रत्येक निष्पादन में केवल एक पंक्ति होती है। भाग्य के रूप में, हमारे डेटा में 0x नोटेशन के हिस्से के रूप में प्रत्येक चरित्र से पहले शून्य है। निचला मामला एक्स xxd द्वारा अनदेखा किया जाता है, इसलिए हमें बस इतना करना है कि प्रत्येक 0xhh वर्ण को xxd पर पाइप करें और इसे कार्य करने दें।

टी अवधि अवधि को रिक्त स्थान में अनुवाद करता है ताकि इसे सही तरीके से विभाजित किया जा सके।

+0

मेरे लिए काम नहीं कर रहा है xxd --version = 'xxd V1.10 27oct98' के साथ नए Redhat linux (ksh के साथ) पर। मुझे बस एक § चार मिलता है। – shellter

+0

यह वही है जो मुझे मिलता है। डेटा टेक्स्ट नहीं है, इसलिए यह बहुत अच्छी तरह प्रिंट नहीं करता है। इसे प्रिंट करने योग्य रूप में देखने के लिए, मेरे कोड को बैश फ़ंक्शन में डालें, जैसे danstest() {...}। फिर, फ़ंक्शन को कॉल करें और आउटपुट को हेक्सडम्प-सी पर पाइप करें। यह आपको बाइट-फॉर-बाइट दिखाएगा कि मेरे कोड से कौन सा डेटा आ रहा है। –

+1

ठंडा। आप बस कर सकते हैं ... ... किया | हेक्सडम्प-सी', कोई फ़ंक्शन आवश्यक नहीं है। आप सभी को शुभकामनायें। – shellter

1

echo -e गलत भागने की वजह से आपके लिए असफल रहा होगा। निम्नलिखित कोड एक ऐसी ही उत्पादन पर मेरे लिए ठीक काम करता है your_program with arguments से:

echo -e $(your_program with arguments | sed -e 's/0x\(..\)\.\?/\\x\1/g') 

कृपया ध्यान दें लेकिन है कि अपने मूल hexstring प्रिंट न हो सकने वर्ण होते हैं।

57

यह मेरे लिए काम किया।

$ echo 54657374696e672031203220330 | xxd -r -p 
Testing 1 2 3$ 

-r बताता है यह विपरीत

-p कर के अपने सामान्य मोड के रूप में विरोध किया ASCII करने के लिए हेक्स कन्वर्ट करने के लिए यह बताता है एक सादे स्वरूप का उपयोग करना।

+1

@BradKoch प्रतिक्रिया के लिए धन्यवाद! मैंने कमांड लाइन झंडे का एक स्पष्टीकरण जोड़ा, जो बाद में इस प्रश्न पर वापस आने पर मेरी मदद करेगा क्योंकि मैं भूल गया था कि यह कैसे करें। – funroll

4

आप इस तरह कुछ उपयोग कर सकते हैं।

$ cat test_file.txt 
54 68 69 73 20 69 73 20 74 65 78 74 20 64 61 74 61 2e 0a 4f 6e 65 20 6d 6f 72 65 20 6c 69 6e 65 20 6f 66 20 74 65 73 74 20 64 61 74 61 2e 

$ for c in `cat test_file.txt`; do printf "\x$c"; done; 
This is text data. 
One more line of test data. 
+0

मैं एक गेम (एलिट: खतरनाक) से रहस्यमय डेटा को डीकोड करने की कोशिश कर रहा हूं जो दशमलव की तरह दिखता है, ऐसा लगता है ('\ x' के बजाय' \\ 'के साथ)। (: – seaturtle

0

आपके द्वारा प्रदान किए गए मान यूटीएफ -8 मान हैं। जब निर्धारित करते हैं, की सरणी:

declare -a ARR=(0xA7 0x9B 0x46 0x8D 0x1E 0x52 0xA7 0x9B 0x7B 0x31 0xD2) 

प्रत्येक मान के प्लेन टेक्स्ट वर्ण मुद्रित करने के लिए पार्स किया जाएगा।

for ((n=0; n < ${#ARR[*]}; n++)); do echo -e "\u${ARR[$n]//0x/}"; done 

और उत्पादन में कुछ प्रिंट करने योग्य पात्रों और कुछ प्रिंट न हो सकने पात्रों निकलेगा यहाँ दिखाया गया है:

echo -e "\x<hex value here>" 
:

enter image description here

हेक्स मान परिवर्तित echo आदेश का उपयोग प्लेन टेक्स्ट के लिए

और echo कमांड का उपयोग करके यूटीएफ -8 मानों को सादे टेक्स्ट में परिवर्तित करने के लिए:

echo -e "\u<UTF-8 value here>" 

और फिर echo आदेश का उपयोग करने के लिए प्लेन अष्टाधारी परिवर्तित करने के लिए:

echo -e "\0<octal value here>" 

आप एन्कोडिंग मान हैं तो आप से परिचित नहीं हैं, आम एन्कोडिंग में पर्वतमाला की जाँच करने के लिए समय लेने के लिए यह निर्धारित करने के लिए योजनाएं कि मूल्य क्या एन्कोडिंग है। फिर वहां से रूपांतरण एक तस्वीर है।

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