শেল স্ক্রিপ্টে বাইনারি থেকে হেক্সাডেসিমাল এবং দশমিক


20

আমার একটি প্রসঙ্গ আছে যেখানে আমার শেল স্ক্রিপ্টে বাইনারিকে হেক্সাডেসিমাল এবং দশমিক এবং বিপরীতে রূপান্তর করতে হবে। কেউ কি আমাকে এর জন্য একটি সরঞ্জাম প্রস্তাব করতে পারেন?


7
সাম্প্রতিক উত্তরগুলি দেখে, আপনার "বাইনারি" অর্থ বাইনারি নম্বর বা বাইনারি ফাইল কিনা তা নির্দিষ্ট করা উচিত ।
manatwork

উত্তর:


39

খাঁটি ব্যাশে ( এবং বিল্টইনগুলি) বাইনারি থেকে রূপান্তর করা মোটামুটি সোজা :echoprintf

বাইনারি থেকে দশমিক

$ echo "$((2#101010101))"
341

বাইনারি থেকে হেক্সাডেসিমাল

$ printf '%x\n' "$((2#101010101))"
155

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


হেক্সাডেসিমাল দশমিক সম্পর্কে।
বাঙ্গি

2
printf '%x\n' 10উদাহরণস্বরূপ, বাঙ্গি ঠিক করুন ।
ক্রিস ডাউন

1
printf %dবিন 2dec এর জন্য কী ব্যবহার করার দরকার? $(( ... ))ইতিমধ্যে একটি দশমিক ফলাফল দেয়, echoযথেষ্ট।
Andrea Corbellini

@ আন্দ্রে কার্বেলিনী - ব্যক্তিগত পছন্দ। সাধারণভাবে, আমি বিভিন্ন কারণে (বেশিরভাগ বহনযোগ্যতা) এর printf '%s\n' fooপরিবর্তে ব্যবহার করি echo, একই কারণে, আমি এখানে এটি ব্যবহার করি না।
ক্রিস ডাউন

@ ক্রিসডাউন: আমি যদিও এই প্রশ্নটি স্পষ্টভাবে বাশকে নিয়ে ছিলাম (যার একটি ভাল প্রয়োগকৃত echoবিল্টিন রয়েছে)। আমার খারাপ!
Andrea Corbellini

16

বাইনারি অনুসারে ধরে নিলে, আপনার বাইনারি ডেটার অর্থ 0 হিসাবে কোনও সম্ভাব্য বাইট মান সহ ডেটা হিসাবে এবং বেস -২ নম্বর নয়:

রূপান্তর করতে থেকে বাইনারি, od(আদর্শ), xxd(দিয়ে আসে vim) অথবা perl'র unpackমনে আসে।

od -An -vtu1 # for decimal
od -An -vtx1 # for hexadecimal

xxd -p # for hexa

perl -pe 'BEGIN{$\="\n";$/=\30};$_=unpack("H*",$_)' # like xxd -p

# for decimal:
perl -ne 'BEGIN{$\="\n";$/=\30;$,=" "}; print unpack("C*",$_)'

এখন, বাইনারি, (স্ট্যান্ডার্ড), বা এর মধ্যে ফিরে রূপান্তর করতে :awkxxd -rperlpack

দশমিক আউটপুট থেকে od -tu1বা perlউপরে:

LC_ALL=C awk '{for (i = 1; i <= NF; i++) printf "%c", $i}'
perl -ape '$_=pack("C*",@F)'

হেক্সা perlবা xxd -pউপরে থেকে:

xxd -r -p
perl -pe 'chomp;$_=pack("H*",$_)'

13

আপনি পরামিতি ibaseএবং obaseপরামিতিগুলি ব্যবহার করে এর জন্য বিসি ব্যবহার করতে পারেন :

কৌশলটি হ'ল আপনার বেসগুলি সম্পর্কে স্পষ্ট হওয়া দরকার। সুতরাং আপনার আইবেসটি যদি 2 হয়, তবে আপনি যদি নিজের মানচিত্রটি 10 ​​এ সেট করেন তবে এটি কোনও কিছুই করবে না, যেমন বাইনারি 10 টি 2 হয়। সুতরাং আপনাকে হেক্সাডেসিমাল নোটেশনটি ব্যবহার করতে হবে।

সুতরাং বাইনারি থেকে দশমিকটি হবে (ঘড়ির কাঁটা হ'ল এ দেখুন)

বাইনারি থেকে দশমিক:

$> echo 'ibase=2;obase=A;11110001011010'|bc
15450

বাইনারি থেকে হেক্স:

$> echo 'ibase=2;obase=10000;11110001011010'|bc
3C5A

যদি প্রথমে 'আউটপুট বেস' obaseপরিবর্তন করা হয় তবে এটি আরও সহজ হওয়া উচিত:

$> echo 'obase=10;ibase=2;11110001011010'|bc
15450
$> echo 'obase=16;ibase=2;11110001011010'|bc
3C5A

6
এই দ্বিতীয় উদাহরণটি ভুল - 'এফ' বেস 15 হবে, 16 নয় (হেক্সে দশমিক 16 হবে 10, এফ নয়)। দশমিক 15, সমান হওয়া উচিতecho 'ibase=2;obase=F;1111 যা চেষ্টা করুন । হেক্সে এফ। এটি 10 ​​হিসাবে প্রকাশিত হয়, যা এটি 15 ভিত্তিতে (অঙ্ক 0-ই) হয়। এছাড়া সহজ যদি আপনি obase রাষ্ট্র প্রথম , যেমন: । কোনও বিভ্রান্তি নেই। echo 'obase=16;ibase=2;1111'|bc
স্বর্ণিলোক

2
এখন এটি সবচেয়ে খারাপ। একবার আপনি সেট ibase, আপনি ইনপুট প্রদান করতে হবে যে বেস, এমনকি obase। সুতরাং আপনার উদাহরণ হতে হবে echo 'ibase=2;obase=10000;11110001011010'|bc। সোনারিলকসের পরামর্শ শুনে আরও ভাল শুনুন এবং ক্রমটি বিপরীত করুন - obaseতারপরে প্রথমে সেট করুন ibase
manatwork

3

আপনি যদি বেস -2 থেকে 10 বা 16 এবং পিছনে সংখ্যাগুলির রূপান্তর বোঝাতে bcচান তবে এটি ইতিমধ্যে parsossy দ্বারা উল্লিখিত হিসাবে করার মানক সরঞ্জাম ।

decimal=123
binary=$(echo "obase=2;$decimal" | bc)
hex=$(echo "obase=16;ibase=2;$binary" | bc)

কিছু শাঁস zshতাদের গাণিতিক সম্প্রসারণ অপারেটরের অংশ হিসাবে বেস রূপান্তরকরণের জন্য বিল্টিন সমর্থন সমর্থন করেছে:

decimal=123
binary=$(([##2]decimal))
hex=$(([##16]decimal))
hex=$(([##16]2#$binary))
decimal=$((2#$binary))

ইত্যাদি।

উভয় ksh93এবং zshসমর্থন:

typeset -i2 binary=123
typeset -i16 dec2hex=123 bin2hex='2#1111'

তবে মনে রাখবেন, প্রসারিত হওয়ার পরে $binaryএকটি 2#বা 16#উপসর্গ থাকবে (যা দিয়ে আপনি স্ট্রিপ করতে পারেন) ${binary#*#}

ksh93 সমর্থন করে:

printf "%..2d\n" 123

বাইনারি রূপান্তর করতে।


1

হেক্সাডেসিমেল ব্যবহার বাইনারি জন্য: xxd যাও লিনাক্সে টুল ও বাইনারি দশমিকে আপনার qalculate টুল ব্যবহার করতে পারেন।

এক্সএক্সডি টাইপ xxd --helpবা man xxdলিনাক্স সম্পর্কিত সহায়তার জন্য ।


1

আপনি পিএইচপি ব্যবহার করতে পারেন:

$ php -r 'printf("%b", 11);'
1011

বা পার্ল:

$ perl -e 'print unpack("B*", pack("c", 11))'
00001011

$ perl -e 'print unpack("B*", pack("C", 11))'
00001011

$ perl -e 'print unpack("B*", pack("W", 11))'
00001011

$ perl -e 'print unpack("B*", pack("n", 11))'
0000000000001011

$ perl -e 'print unpack("B*", pack("N", 11))'
00000000000000000000000000001011

বা পসিক্স আওক এসএনএনপেন / স্টিডলিব :

$ awklib 'BEGIN {print mt_basecon(1011, 2, 16)}'
B

$ awklib 'BEGIN {print mt_basecon(1011, 2, 10)}'
11

$ awklib 'BEGIN {print mt_basecon("B", 16, 2)}'
1011

$ awklib 'BEGIN {print mt_basecon(11, 10, 2)}'
1011

0

পূর্ববর্তী উত্তরে উল্লিখিত হিসাবে আপনি প্রতিধ্বনি এবং প্রিন্টফ ব্যবহার করে বাইনারি থেকে ডেসিমাল এবং হেক্সা দশমিক করতে পারেন do আমি এখানে কেবল যুক্ত করছি যে কীভাবে ডেসিমাল এবং হেক্স থেকে বাইনারি রূপান্তর করতে খাঁটি বাশ ব্যবহার করে।

প্রতিধ্বনি থেকে দশমিক প্রতিধ্বনি ব্যবহার করে

echo "$((2#101010101))"
341

প্রিন্টফ ব্যবহার করে বাইনারি থেকে হেক্সা-ডেসিমাল

printf '%x\n' "$((2#101010101))"
155

কেবলমাত্র ব্যাশ ব্যবহার করে বাইনারি রূপান্তর করতে দশমিক দশমিক

কেবল বাশ ব্যবহার করে, আপনি যদি দশমিককে বাইনারি রূপান্তর করতে চান তবে আপনি এটি নীচের মতো করতে পারেন:

touch dec2bin && chmod +x "$_" && vim "$_"

এবং তারপরে নিম্নলিখিতটি অনুলিপি করুন এবং পেস্ট করুন:

#!/bin/bash
## converting decimal integer to binary, pass int as a parameter
num=$1;
dec2bin()
{   [ "$num" == "" ] && { printf "Error: Pass an integer\n"; exit 1; };
    op=2; ## Since we're converting to binary
    quo=$(( $num / $op)); rem=$(( $num % $op)); ## quotient and remainder
    remarray=(); ## array for putting remainder inside array
    remarray+=("$rem"); ## array expansion
        until [[ $quo -eq 0 ]]; do
            num=$quo; quo=$(( $num / $op)); ## looping to get all remainder untill 0
            rem=$(( $num % $op)); remarray+="$rem"; ## array expansion
        done
    binary=$(echo "${remarray[@]}" | rev); ## reversing array
    printf "$binary\n"; ## printing reversed array
}
main()
{   [[ -n ${num//[0-9]/} ]] &&
        { printf "Error: $num is not an integer bruv!\n"; return 1;
        } || { dec2bin $num; }
}
main;

এবং তারপরে আপনি যেখানে সংরক্ষণ করেছেন সেখান থেকে চেষ্টা করে দেখুন:

./dec2bin 420
110100100

পূর্ণসংখ্যা যোগ করতে হবে !!

./dec2bin 420.py
420.py is not an integer bruv!

কেবলমাত্র ব্যাশ ব্যবহার করে হেক্সাডেসিমাল থেকে বাইনারি রূপান্তর

একইভাবে, বাইনারি থেকে হেক্সাডেসিমাল, কেবলমাত্র ব্যাশ ব্যবহার করে:

#!/usr/local/bin/bash
## converting hexadecimal to binary, pass hex as a parameter
hex=$1;
hex2bin()
{   [ "$hex" == "" ] && { printf "Error: Pass a hex\n"; exit 1; };
    op=2; num=$((16#$hex)); ## converting hex to integer
    quo=$(( $num/ $op)); rem=$(( $num% $op)); ## quotient and remainder
    remarray=(); remarray+=("$rem"); ## array expansion
        until [[ $quo -eq 0 ]]; do
            num=$quo; quo=$(( $num / $op)); ## looping to get all remainder untill 0
            rem=$(( $num % $op)); remarray+="$rem"; ## array expansion
        done
    binary=$(echo "${remarray[@]}" | rev); ## reversing array
    printf "$binary\n"; ## printing reversed array
}
main()
{
[[ -n ${hex//[0-9,A-F,a-f]/} ]] &&
    { printf "Error: $hex is not a hex bruv!\n"; return 1;
    } || { hex2bin $hex; }
}
main;

উদাহরণ স্বরূপ:

./hex2bin 1aF
110101111

হেক্স পাস করতে হবে:

./hex2bin.bash XyZ
XyZ is not a hexa decimal number bruv!
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.