2011-06-09 22 views
34

यह पूछने में थोड़ा बेवकूफ लगता है (मूल बातें के रूप में लगता है) लेकिन कहीं और जवाब नहीं मिल रहा है। मैं बाइनरी डेटा को हेक्स में परिवर्तित करना चाहता हूं, बस इतना, कोई फैंसी स्वरूपण और सब कुछ नहीं। hexdump बहुत चालाक लगता है, यह मेरे लिए "overformats" है। मैं/dev/random से x बाइट्स लेना चाहता हूं और उन्हें हेक्स के रूप में पास करना चाहता हूं।शैल स्क्रिप्ट में बाइनरी डेटा हेक्स में कनवर्ट करें?

अधिमानतः मैं केवल मानक linux उपकरणों का उपयोग करने, ताकि मैं (कई देखते हैं)

+0

मुझे उपयोग करना था/dev/urandom,/dev/random बस –

+2

@ AquariusPower यादृच्छिक ब्लॉक जब उसके पास पर्याप्त यादृच्छिक डेटा नहीं है, जबकि यादृच्छिक नहीं है (आईआईआरसी इसके पास क्या है) – davka

उत्तर

50

शायद का उपयोग हर मशीन पर इसे स्थापित करने की जरूरत नहीं है चाहता हूँ xxd:

% xxd -l 16 -p /dev/random 
193f6c54814f0576bc27d51ab39081dc 
+5

xxd vim का हिस्सा है, तो यह हमेशा स्थापित नहीं किया जा सकता है। –

+1

ध्यान दें कि आप प्रति पंक्ति बाइट्स की संख्या बदलने के लिए '-c' का उपयोग कर सकते हैं। दुर्भाग्यवश आप इसे केवल 256 पर सेट कर सकते हैं जिसके बाद आपको कुछ न्यूलाइन की आवश्यकता है। –

8

शायद आप सी में अपने खुद के छोटे उपकरण लिख सकता है, और ऑन-फ्लाई यह संकलन:

int main (void) { 
    unsigned char data[1024]; 
    size_t numread, i; 

    while ((numread = read(0, data, 1024)) > 0) { 
    for (i = 0; i < numread; i++) { 
     printf("%02x ", data[i]); 
    } 
    } 

    return 0; 
} 

और फिर मानक इनपुट से यह फ़ीड:

cat /bin/ls | ./a.out 

आप हेर्डोक वाक्यविन्यास का उपयोग करके इस छोटे सी प्रोग्राम को शेल स्क्रिप्ट में भी एम्बेड कर सकते हैं।

+3

सी, इसके लिए? यह एक ओवरकिल है। –

+1

ठीक है, लेकिन आपके पास स्वरूपण और व्यवहार पर पूर्ण नियंत्रण है :-) –

+0

यह हमेशा एक विकल्प है, लेकिन मुझे पूरा यकीन था कि इसे पहले हल किया गया है :) – davka

3

dd + hexdump भी काम करेगा:

dd bs=1 count=1 if=/dev/urandom 2>/dev/null | hexdump -e '"%x"' 
+0

धन्यवाद, मैंने इस तरह से शुरू किया लेकिन हेक्सडम्प को जो भी मैं चाहता हूं वह नहीं कर सका।मुझे पूरा यकीन था कि इसमें मेरे पास विकल्प है, लेकिन इसे मैन पेज – davka

+2

में नहीं मिला, इस समाधान के साथ (हेक्सडम्प-'' '% x' '):' \ n '->' a '(गायब अग्रणी '0'), 'abcde' -> '6463626165' (गलत बाइट ऑर्डर)। गैर-यादृच्छिक डेटा अनुप्रयोगों में यह बहुत बुरा हो सकता है! –

23

से सावधान रहें!

hexdump और xxd परिणाम अलग अंतराल में देते हैं!

$ echo -n $'\x12\x34' | xxd -p 
1234 
$ echo -n $'\x12\x34' | hexdump -e '"%x"' 
3412 

http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef01543533e604970c-800wi: डी

+4

'echo -n $' \ x12 \ x34 'का उपयोग करें। हेक्सडम्प-ए '/ 1 "% x"' 'एक ही अंतहीनता प्राप्त करने के लिए। –

19
आयुध डिपो के साथ

(जीएनयू सिस्टम):

$ echo abc | od -A n -v -t x1 | tr -d ' \n' 
6162630a 
hexdump साथ

(BSD सिस्टम):

$ echo abc | hexdump -ve '/1 "%02x"' 
6162630a 

से http://en.wikipedia.org/wiki/Hex_dump#od_and_hexdump:
"पर निर्भर करता है आपका सिस्टम प्रकार, या तो दोनों या दोनों इन दो उपयोगिताओं में से उपलब्ध होगा - बीएसडी सिस्टम हेक्सडंप के लिए ओडी को हटा देता है, जीएनयू सिस्टम रिवर्स। "

+1

4 वर्षों के बाद (ज्यादा नहीं, मुझे पता है), ज्यादातर बार मैं * निक्स के बारे में एक धागा पढ़ता हूं, मैं वास्तव में कुछ पुराने और अभी भी मेरे लिए बिल्कुल नया सीखता हूं। ओडी के लिए +1, इसके बारे में कभी नहीं सुना, बहुत उपयोगी और सिगविन पर भी मौजूद है। ;-) –

1

यदि आपको बड़ी स्ट्रीम (कोई न्यूलाइन नहीं) की आवश्यकता है तो आप बाइट-बाय-बाइट रूपांतरण के लिए tr और xxd (vim का हिस्सा) का उपयोग कर सकते हैं।

head -c1024 /dev/urandom | xxd -p | tr -d $'\n' 

या आप शब्द-दर-शब्द रूपांतरण के लिए hexdump (POSIX) का उपयोग कर सकते हैं।

head -c1024 /dev/urandom | hexdump '-e"%x"' 

ध्यान दें कि अंतर अंतहीनता है।

+2

'echo abc | का उपयोग करें हेक्सडम्प-ए '/ 1 "% 02x"' 'नेटवर्क ऑर्डर पाने के लिए और 0 0x0a' के लिए 0। –

1

इस तीन आदेशों एक ही (0102030405060708090a0b0c) प्रिंट होगा:

n=12 
echo "$a" | xxd -l "$n" -p 
echo "$a" | od -N "$n" -An -tx1 | tr -d " \n" ; echo 
echo "$a" | hexdump -n "$n" -e '/1 "%02x"'; echo 

को देखते हुए 1 से 26 करने के लिए कि n=12 और $a बाइट मूल्यों है:

a="$(printf '%b' "$(printf '\\0%o' {1..26})")" 

इस्तेमाल किया जा सकता है कि $n पाने के लिए प्रत्येक प्रोग्राम में यादृच्छिक बाइट मान:

xxd -l "$n" -p     /dev/urandom 
od -vN "$n" -An -tx1   /dev/urandom | tr -d " \n" ; echo 
hexdump -vn "$n" -e '/1 "%02x"' /dev/urandom ; echo 
5

सभी समाधान याद करना मुश्किल या बहुत जटिल होने लगते हैं, मैं printf का उपयोग कर पाते हैं कम से कम एक:

$ printf '%x\n' 256 
100 

[संपादित करें]

लेकिन जैसे टिप्पणी में बताया गया है, यह है कि क्या लेखक चाहता है नहीं है, इसलिए नीचे उचित होना पूर्ण जवाब है।

... उत्पादन वास्तविक बाइनरी डेटा स्ट्रीम करने के लिए ऊपर का उपयोग करें:

printf '%x\n' $(cat /dev/urandom | head -c 5 | od -An -vtu1) 

यह क्या करता है:

  • printf '% एक्स \ N' .... - का एक अनुक्रम प्रिंट पूर्णांक, यानी। printf '%x,' 1 2 3, प्रिंट होगा 1,2,3,
  • $ (...) - यह एक तरह से कुछ शेल कमांड के उत्पादन में हो और इसे संसाधित
  • cat /dev/urandom लिए है - यह यादृच्छिक बाइनरी डेटा
  • head -c 5 आउटपुट - 5 बाइट्स बाइनरी डेटा को सीमित करता है
  • od -An -vtu1 - अष्टाधारी डंप आदेश, धर्मान्तरित द्विआधारी एक testcase के रूप में दिया गया दशमलव

('एक', 61 हेक्स है 'पी' 70 हेक्स, ... है):

$ printf '%x\n' $(echo "apple" | head -c 5 | od -An -vtu1) 
61 
70 
70 
6c 
65 

या अलग-अलग द्विआधारी बाइट्स परीक्षण करने के लिए, पर इनपुट ('\\x%x' प्रारूप यह होता है), होगा उत्पादन 61 दशमलव ('=' वर्ण) बाइनरी डेटा उत्पादन करने के लिए देने के आदेश ऊपर सही ढंग से 3 डी (दशमलव 61) की सुविधा देता है:

$printf '%x\n' $(echo -ne "$(printf '\\x%x' 61)" | head -c 5 | od -An -vtu1) 
3d 
+0

वाह, यह आसान है! – davka

+0

@ МалъСкрылевъ मैंने अपना जवाब अपडेट कर लिया है, आप सही हैं, मुझे प्रश्न का मुख्य बिंदु याद आया - मैं शायद दशमलव में दशमलव में हेक्स में परिवर्तित करने का सबसे आसान तरीका ढूंढ रहा था, और यह उत्तर Google में पहले जैसा दिखता है। – marcinj

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