ব্যাশে একটি হেক্সাডেসিমাল নম্বর উল্টো করুন


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
আপনার প্রশ্নের উত্তর যোগ করবেন না দয়া করে।
বিড়াল

@ কেট আমি উত্তরটি যুক্ত করেছি কারণ যে আমার পক্ষে কাজ করেছে, তা নির্বাচিত উত্তরের মন্তব্যে। তবে আমি ঠিক করে দিচ্ছি।
আইয়াকি মুরিলো

2
উত্তর বাক্সের নীচে "এই প্রশ্নের উত্তর দিন" বোতামটি ক্লিক করে আপনি এটি উত্তর হিসাবে যুক্ত করতে পারেন (স্ব-উত্তরগুলি উত্সাহিত হয়), এবং আপনার উচিত, এটি কেবল প্রশ্নটিতে রাখা উচিত নয়।
বিড়াল

2
আমার মধ্যে সি প্রোগ্রামার বলতে "010203" একটি অকট্যাল সংখ্যাকে, না একটি হেক্স সংখ্যা (0x10203) হল চায়
infixed

@ ইনফিক্সড আপনি ভুল নন, তবে আমি এমন একটি উত্তর চেয়েছিলাম যা 010203হেক্সাডেসিমাল হিসাবে বিবেচিত হয় , যদিও আমি ব্যবহার করি না 0x
Iñaki Murillo

উত্তর:


11

আপনি করতে পারেন এটা বাইনারিতে রূপান্তর , বাইট বিপরীত , ঐচ্ছিকরূপে নতুন লাইন trailing অপসারণ 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

যদি স্ট্রিংটিতে NUL বাইট থাকে তবে এটি কাজ করে না , কারণ revসেই সময়ে আউটপুট কেটে যাবে।


2
আমি এর 0102030aপরিবর্তে পেয়েছি010203
Iñaki মুরিলো

@ l0b0 এবং আমিও, পেয়ে যাব0102030a
বাবা

2
আপনার 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' NUL বাইট থাকে তবে এটি কাজ করে না।
সিলভাইন লেরাক্স

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'... ()
বিভাজককেও ধরতে

পেস্টটি ব্যবহার করার পরিবর্তে আপনি ব্যবহার করতে পারেনtr -d '\n'
কেহোল্যান্ড

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

ইপুর সিরারের উত্তরটির ভিত্তিতে https://unix.stackexchange.com/a/321867/337458 আমি আপনাকে এটির ~/.bashrcজন্য একটি দুর্দান্ত আদেশ দিতে সুপারিশ করব যা আপনি কেবল কল করতে পারেন:

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

$> hex_inverse 030201

010203
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.