बैश में एक हेक्साडेसिमल संख्या को उल्टा करें


10

क्या हेक्साडेसिमल संख्या को उलटने के लिए एक सरल आदेश है?

उदाहरण के लिए, हेक्साडेसिमल संख्या दी गई है:

030201

आउटपुट होना चाहिए:

010203

revकमांड का उपयोग करते हुए , मुझे निम्नलिखित मिलते हैं:

102030

अपडेट करें

$ bash --version | head -n1
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
$ xxd -version
xxd V1.10 27oct98 by Juergen Weigert
$ rev --version
rev from util-linux 2.20.1

2
कृपया अपने प्रश्न का उत्तर न जोड़ें।
बिल्ली

@ मैंने जवाब जोड़ा क्योंकि जो मेरे लिए काम करता था, वह चयनित उत्तर की टिप्पणियों पर है। लेकिन मैं इसे हटा रहा हूं।
15:48

2
आप उत्तर बॉक्स के नीचे "इस सवाल का जवाब" बटन पर क्लिक करके इसे एक उत्तर के रूप में जोड़ सकते हैं (स्व-उत्तर प्रोत्साहित किए जाते हैं), और आपको चाहिए, बस इसे प्रश्न में न डालें।
बिल्ली

2
मुझमें C प्रोग्रामर कहना चाहता है "010203" एक अष्टक संख्या है, न कि एक हेक्स संख्या (0x10203)
9

@infixed आप गलत नहीं हैं, लेकिन मुझे एक जवाब चाहिए था जो 010203एक हेक्साडेसिमल के रूप में व्यवहार करता है , भले ही मैं उपयोग नहीं करता हूं 0x
इनाकी मुरिलो

जवाबों:


11

आप इसे बाइनरी में बदल सकते हैं , बाइट्स को उल्टा कर सकते हैं , वैकल्पिक रूप से अनुगामी न्यूलाइन्स rev<2.24 को हटा सकते हैं , और इसे वापस कन्वर्ट कर सकते हैं:

$ xxd -revert -plain <<< 030201 | LC_ALL=C rev | tr -d '\n' | xxd -plain
010203

का उपयोग करते हुए

$ bash --version | head -n1
GNU bash, version 4.3.42(1)-release (x86_64-redhat-linux-gnu)
$ xxd -version
xxd V1.10 27oct98 by Juergen Weigert
$ rev --version
rev from util-linux 2.28.2

यह काम नहीं करता है यदि स्ट्रिंग में एनयूएल बाइट शामिल है, क्योंकि revउस बिंदु पर आउटपुट को छोटा कर दिया जाएगा।


2
0102030aइसके बदले मुझे मिलता है010203
इनाकी मुरिलो

@ l0b0 और मुझे भी, 0102030a
बाबा

2
@ IñakiMurillo अपने revसंस्करण में 2.20.1; इस फॉर्मेट का उपयोग करेंxxd -revert -plain <<< '030201' | LC_ALL=C rev | tr -d '\n'| xxd -plain
बाबा

2
revसंस्करण से पहले 2.24एक नई लाइन बग है। अधिक जानकारी github.com/karelzak/util-linux/commit/…
बाबा

1
यदि हेक्स स्ट्रिंग में '00' एनयूएल बाइट शामिल है तो यह काम नहीं करता है।
सिल्वेन लेरॉक्स

10

अगर आपके सिस्टम में revकमांड है।

hex=030201
new_hex=$(printf %s "$hex" | dd conv=swab 2> /dev/null | rev)

यदि यह एक tacया tail -rआदेश है:

new_hex=$(echo "$hex" | fold -w 2 | tac | paste -sd '\0' -)

के साथ zsh:

setopt extendedglob
new_hex=${(j::)${(s::Oa)${hex//(#b)(?)(?)/$match[2]$match[1]}}}

( ddएप्रोच की तरह : वर्णों की जोड़ी को स्वैप करें, अलग-अलग पात्रों की सूची में विभाजित करें ( s::), ऑर्डर को रिवर्स करें ( Oa) और ज्वाइन ( j::) करें।

POSIXly:

new_hex=$(
  awk '
    BEGIN {
      hex = ARGV[1]; l = length(hex)
      for (i = 1; i < l; i += 2)
        new_hex = substr(hex, i, 2) new_hex
      print new_hex
    }' "$hex"
)

या

new_hex=$(echo "$hex" |
  sed -e 'G;:1' -e 's/\(..\)\(.*\n\)/\2\1/;t1' -e 's/.//')

के साथ perl:

new_hex=$(perl -le 'print reverse(shift =~ /../g)' -- "$hex")

3
मैं सुझाव देने जा रहा था perl -F'(..)' -lane 'print reverse(@F)':)
सुंदरदीप

1
@ संदीप, अच्छा। मुझे नहीं पता था कि कोई इस -Fतरह का उपयोग कर सकता है। (मैं इसे split()अब मैनुअल में वर्णित देख सकता हूं )।
स्टीफन चेज़लस

1
जहाँ तक मुझे पता है, -Fमूल रूप से बंटवारा है $_.. इसके अलावा रेगेक्स का उपयोग करने के अलावा -F'/"\K\|(?=")/'एक विभाजन की संख्या को भी निर्दिष्ट कर सकते हैं ... जैसे -F'/:/,$_,2'... उपयोग करें ()यदि विभाजक को भी कैप्चर करना है
Sundeep

उपयोग करने के बजाय पेस्ट आप इस्तेमाल कर सकते हैंtr -d '\n'
AKHolland

10

fold+ tac+ के साथ tr:

$ echo 030201|fold -w2|tac|tr -d "\n"
010203
  • fold - हर 2 बाइट को विभाजित करें
  • tac - उल्टा बिल्ली
  • tr - नई सुर्खियों को हटा दें

4
perl -nE 'say reverse /(..)/g'

यह प्रत्येक हेक्साडेसिमल रेखा को प्रभावित करता है:

  • /(..)/g कैप्चर किए गए मैचों के साथ एक सूची बनाता है


0

Ipor Sircer के जवाब के आधार पर https://unix.stackexchange.com/a/321867/337458 मैं ~/.bashrcआपको एक अच्छी कमांड देने की सलाह दूंगा जिसे आप बस कॉल कर सकते हैं:

function hex_inverse() {
    echo ${1} | fold -w2 | tac | tr -d "\n" ; echo "" 
}

$> hex_inverse 030201

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