আমার একটি প্রসঙ্গ আছে যেখানে আমার শেল স্ক্রিপ্টে বাইনারিকে হেক্সাডেসিমাল এবং দশমিক এবং বিপরীতে রূপান্তর করতে হবে। কেউ কি আমাকে এর জন্য একটি সরঞ্জাম প্রস্তাব করতে পারেন?
আমার একটি প্রসঙ্গ আছে যেখানে আমার শেল স্ক্রিপ্টে বাইনারিকে হেক্সাডেসিমাল এবং দশমিক এবং বিপরীতে রূপান্তর করতে হবে। কেউ কি আমাকে এর জন্য একটি সরঞ্জাম প্রস্তাব করতে পারেন?
উত্তর:
খাঁটি ব্যাশে ( এবং বিল্টইনগুলি) বাইনারি থেকে রূপান্তর করা মোটামুটি সোজা :echoprintf
$ echo "$((2#101010101))"
341
$ printf '%x\n' "$((2#101010101))"
155
একা বাশ ব্যবহার করে বাইনারি ফিরে যাওয়া কিছুটা জটিল, সুতরাং আমি আপনাকে এর সমাধানের জন্য অন্যান্য উত্তরগুলি দেখার পরামর্শ দিচ্ছি।
printf '%x\n' 10উদাহরণস্বরূপ, বাঙ্গি ঠিক করুন ।
printf %dবিন 2dec এর জন্য কী ব্যবহার করার দরকার? $(( ... ))ইতিমধ্যে একটি দশমিক ফলাফল দেয়, echoযথেষ্ট।
printf '%s\n' fooপরিবর্তে ব্যবহার করি echo, একই কারণে, আমি এখানে এটি ব্যবহার করি না।
echoবিল্টিন রয়েছে)। আমার খারাপ!
বাইনারি অনুসারে ধরে নিলে, আপনার বাইনারি ডেটার অর্থ 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*",$_)'
আপনি পরামিতি 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
echo 'ibase=2;obase=F;1111 যা চেষ্টা করুন । হেক্সে এফ। এটি 10 হিসাবে প্রকাশিত হয়, যা এটি 15 ভিত্তিতে (অঙ্ক 0-ই) হয়। এছাড়া সহজ যদি আপনি obase রাষ্ট্র প্রথম , যেমন: । কোনও বিভ্রান্তি নেই। echo 'obase=16;ibase=2;1111'|bc
ibase, আপনি ইনপুট প্রদান করতে হবে যে বেস, এমনকি obase। সুতরাং আপনার উদাহরণ হতে হবে echo 'ibase=2;obase=10000;11110001011010'|bc। সোনারিলকসের পরামর্শ শুনে আরও ভাল শুনুন এবং ক্রমটি বিপরীত করুন - obaseতারপরে প্রথমে সেট করুন ibase।
আপনি যদি বেস -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
বাইনারি রূপান্তর করতে।
হেক্সাডেসিমেল ব্যবহার বাইনারি জন্য: xxd যাও লিনাক্সে টুল ও বাইনারি দশমিকে আপনার qalculate টুল ব্যবহার করতে পারেন।
এক্সএক্সডি টাইপ xxd --helpবা man xxdলিনাক্স সম্পর্কিত সহায়তার জন্য ।
আপনি পিএইচপি ব্যবহার করতে পারেন:
$ 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
পূর্ববর্তী উত্তরে উল্লিখিত হিসাবে আপনি প্রতিধ্বনি এবং প্রিন্টফ ব্যবহার করে বাইনারি থেকে ডেসিমাল এবং হেক্সা দশমিক করতে পারেন 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!