ইউনিক্স শেল স্ক্রিপ্টে দশমিককে হেক্সাডেসিমালে রূপান্তর করুন


110

ইউনিক্স শেল স্ক্রিপ্টে, আমি দশমিক সংখ্যাগুলি হেক্সাডেসিমলে রূপান্তর করতে কী ব্যবহার করতে পারি? আমি ভেবেছিলাম অদ্ভুত কৌশলটি করবে, তবে এটি উপলব্ধি করছে না যে আমি এটি সংখ্যার ASCII উপস্থাপনা খাওয়াচ্ছি।

printf,? স্থূল! আপাতত এটি ব্যবহার করছেন, তবে আর কী পাওয়া যায়?


8
আমাকে জিজ্ঞাসা করতে হবে, প্রিন্টফের মোট কী? অনেকগুলি সাধারণ প্রোগ্রামিং ল্যাঙ্গুয়েজ প্রিন্টফ-এর মতো ফর্ম্যাটিং সমর্থন করে, সুতরাং নীচের প্রিন্টফ সমাধানগুলি অবশ্যই বিকাশকারীদের বোঝার পক্ষে সহজ হবে।
মাইকেল শ্যাপার

4
ছেলে, আমি জানি না - এটি ছিল পাঁচ বছর আগে! আমি মনে করি সম্ভবত আমি ভেবেছিলাম এটি সত্য শেল বা কিছু নয়।
skiphoppy

উত্তর:


108
echo "obase=16; 34" | bc

আপনি যদি পূর্ণসংখ্যার একটি সম্পূর্ণ ফাইল ফিল্টার করতে চান তবে প্রতি লাইনে একটি:

( echo "obase=16" ; cat file_of_integers ) | bc

1
আমি বিসি (1) এবং ডিসি (1) উভয়ের দিকে তাকিয়েছিলাম এবং এটিটি মিস করেছি।
কেলটিয়া

3
@ এসকিপ্পি: আপনি যদি লিখেন: প্রতিধ্বনি "obase = 16; 12 34 56" | বিসি আপনি 1E240 পাবেন, ঠিক যেমনটি লিখেছেন: echo "obase = 16; 123456" | খ্রি। সুতরাং সবগুলি এক লাইনে নির্বিচার সংখ্যার সাথে কাজ করার উপায় হ'ল প্রতিটি সংখ্যা তার নিজস্ব লাইনে রাখা: ট্র '' '\ 015' <ইনপুট | বিসি (নতুন লাইনের মানচিত্র ফাঁকা)।
জোনাথন লেফলার

1
আপনার যদি 'বিসি' হয় তবে এটি দুর্দান্ত, তবে '
প্রিন্টফ

1
@ বিল কারভিন, বা জেডএস, বা ব্যস্তবক্স, তবে সম্ভবত আমি চেষ্টা করেছি এমন কিছু শেল না? আমি আর সরল sh ইনস্টল করে রাখি না তবে স্পষ্টতই স্কিপ্পপি অন্য বিকল্পগুলি কী কী তা সন্ধান করছে
fuzzyTew

2
@ শ্রীধর-Sarnobat, এই হল হেক্সাডেসিমেলে দশমিক। আমি ধরে নিলাম আপনার মানে হেক্সকে ডিসে রূপান্তর করা। এটি করতে, সেট করুন ibase=16। আপনি আরও বিবরণের জন্য বিসিতে ম্যানুয়ালটি পড়তে পছন্দ করতে পারেন ।
বিল কারভিন

186

চেষ্টা করেছেন printf(1)?

printf "%x\n" 34
22

সমস্ত শেলগুলিতে বিল্টিন ফাংশন সহ এটি করার উপায় সম্ভবত রয়েছে তবে এটি কম পোর্টেবল হবে। এর মধ্যে এমন ক্ষমতা আছে কিনা তা দেখার জন্য আমি পসিক্স এসএক্স চশমা পরীক্ষা করে দেখিনি।


5
এটি প্রিন্টফের চেয়ে বেশি পসিক্স পায় না। এটি এমনকি "sh" তেও কাজ করে।
অরওলোফিল

4
প্রিন্টফ আরবিট্রি যথার্থতা নয়। bcহয়। উদাহরণস্বরূপ, 238862874857408875879219909679752457540ইনপুট হিসাবে গ্রহণ করা, প্রিন্টফ আমাদের "ফলাফল খুব বড়" দেয়। বিসি পদ্ধতিটি স্ট্যান্ডার্ড ইনট / লং / বিগিন্টের চেয়ে বড় জিনিসের জন্য দুর্দান্ত কাজ করে
অ্যান্ড্রু ব্যাকার

3
এবং, আপনি হেক্স, ব্যবহারে বড়হাতের অক্ষর চান printf "%X"বড়হাতের এক্স সঙ্গে
andrybak

3
এবং "0x00" এর মতো আউটপুট জোর করতে আপনি প্রিন্টফ "0x% 02X" ব্যবহার করতে পারেন
gbetous

1
... এবং bcসর্বত্র পাওয়া যায় না (কমপক্ষে আমার এম্বেড করা লিনাক্সে নেই)।
ম্যাথিউউ

69

দশমিক থেকে দশমিক:

$ echo $((0xfee10000))
4276158464

দশমিক থেকে হেক্সাডেসিমাল:

$ printf '%x\n' 26
1a


5

দুঃখিত আমার দোষ, চেষ্টা করুন ...

#!/bin/bash
:

declare -r HEX_DIGITS="0123456789ABCDEF"

dec_value=$1
hex_value=""

until [ $dec_value == 0 ]; do

    rem_value=$((dec_value % 16))
    dec_value=$((dec_value / 16))

    hex_digit=${HEX_DIGITS:$rem_value:1}

    hex_value="${hex_digit}${hex_value}"

done

echo -e "${hex_value}"

উদাহরণ:

$ ./dtoh 1024
400

1
ধন্যবাদ এটি env জন্য অনেক সাহায্য করেছে। যেখানে printfএবং hexআদেশগুলি উপলভ্য নয়।
বেঞ্চুক

2
@ বেঞ্চুক কোথায় পাওয়া যায় printfনা?
ম্যাথিউউ


3

ইন zshআপনি আর এই সাজানোর করতে পারেন:

% typeset -i 16 y
% print $(( [#8] x = 32, y = 32 ))
8#40
% print $x $y
8#40 16#20
% setopt c_bases
% print $y
0x20

zshপাটিগণিত মূল্যায়ন সম্পর্কে ডক্স পৃষ্ঠা থেকে নেওয়া উদাহরণ ।

আমি বিশ্বাস করি বাশের একই ক্ষমতা রয়েছে।


2

আমার ক্ষেত্রে, আমি প্রিন্টএফ সমাধান ব্যবহার করে একটি বিষয়ে হোঁচট খেয়েছি:

$ printf "%x" 008 bash: printf: 008: invalid octal number

সবচেয়ে সহজ উপায় ছিল বিসি সহ সমাধানটি উচ্চতর পোস্টে প্রস্তাবিত:

$ bc <<< "obase=16; 008" 8


কয়েক বছর আগে লেখা আপনার সমাধানগুলি কী যুক্ত করে?
ম্যাথিউউ

1
@ ম্যাথিউ এটি শীর্ষস্থানীয় জিরোগুলির সাথে সংখ্যার ইস্যুটির উল্লেখ করেছে, যা বাশ প্রিন্টফ অনিচ্ছাকৃতভাবে অক্টাল হিসাবে ব্যাখ্যা করে এবং সমস্যাটি এড়ানোর একটি সমাধান প্রদর্শন করে।
mwfearnley

2
xd() {
    printf "hex> "
    while read i
    do
        printf "dec  $(( 0x${i} ))\n\nhex> "
    done
}
dx() {
    printf "dec> "
    while read i
    do
        printf 'hex  %x\n\ndec> ' $i
    done
}

1
# number conversion.

while `test $ans='y'`
do
    echo "Menu"
    echo "1.Decimal to Hexadecimal"
    echo "2.Decimal to Octal"
    echo "3.Hexadecimal to Binary"
    echo "4.Octal to Binary"
    echo "5.Hexadecimal to  Octal"
    echo "6.Octal to Hexadecimal"
    echo "7.Exit"

    read choice
    case $choice in

        1) echo "Enter the decimal no."
           read n
           hex=`echo "ibase=10;obase=16;$n"|bc`
           echo "The hexadecimal no. is $hex"
           ;;

        2) echo "Enter the decimal no."
           read n
           oct=`echo "ibase=10;obase=8;$n"|bc`
           echo "The octal no. is $oct"
           ;;

        3) echo "Enter the hexadecimal no."
           read n
           binary=`echo "ibase=16;obase=2;$n"|bc`
           echo "The binary no. is $binary"
           ;;

        4) echo "Enter the octal no."
           read n
           binary=`echo "ibase=8;obase=2;$n"|bc`
           echo "The binary no. is $binary"
           ;;

        5) echo "Enter the hexadecimal no."
           read n
           oct=`echo "ibase=16;obase=8;$n"|bc`
           echo "The octal no. is $oct"
           ;;

        6) echo "Enter the octal no."
           read n
           hex=`echo "ibase=8;obase=16;$n"|bc`
           echo "The hexadecimal no. is $hex"
           ;;

        7) exit 
        ;;
        *) echo "invalid no." 
        ;;

    esac
done

1

এটি কোনও শেল স্ক্রিপ্ট নয়, তবে বিন্যাস / ডিস / ডিস / হেক্সের মধ্যে সংখ্যাগুলি রূপান্তর করতে আমি ব্যবহার করছি ক্লাইট সরঞ্জাম:

    #!/usr/bin/perl

    if (@ARGV < 2) {
      printf("Convert numbers among bin/oct/dec/hex\n");
      printf("\nUsage: base b/o/d/x num num2 ... \n");
      exit;
    }

    for ($i=1; $i<@ARGV; $i++) {
      if ($ARGV[0] eq "b") {
                    $num = oct("0b$ARGV[$i]");
      } elsif ($ARGV[0] eq "o") {
                    $num = oct($ARGV[$i]);
      } elsif ($ARGV[0] eq "d") {
                    $num = $ARGV[$i];
      } elsif ($ARGV[0] eq "h") {
                    $num = hex($ARGV[$i]);
      } else {
                    printf("Usage: base b/o/d/x num num2 ... \n");
                    exit;
      }
      printf("0x%x = 0d%d = 0%o = 0b%b\n", $num, $num, $num, $num);
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.