শেল স্ক্রিপ্টে হেক্সাডেসিমাল থেকে দশমিক


126

কেউ আমাকে শেল স্ক্রিপ্টের হেক্সাডেসিমাল সংখ্যাটিকে দশমিক সংখ্যায় রূপান্তর করতে সহায়তা করতে পারেন?

উদাহরণস্বরূপ, আমি bfca3000শেল স্ক্রিপ্ট ব্যবহার করে হেক্সাডেসিমাল সংখ্যাটি দশমিকের মধ্যে রূপান্তর করতে চাই । আমি মূলত দুটি হেক্সাডেসিমাল সংখ্যার পার্থক্য চাই।

আমার কোডটি হ'ল:

var3=`echo "ibase=16; $var1" | bc`
var4=`echo "ibase=16; $var2" | bc`
var5=$(($var4-$var3))               # [Line 48]

কার্যকর করার সময়, আমি এই ত্রুটিটি পেয়েছি:

Line 48: -: syntax error: operand expected (error token is "-")

অন্য উপায়ে: স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / ৩78৮৮২২ / । মূলত একই সরঞ্জাম। এবং সম্ভব ক্রস সাইটের সদৃশ: superuser.com/questions/226163/...
সিরো Santilli郝海东冠状病六四事件法轮功

উত্তর:


314

হেক্স থেকে দশমিক এ রূপান্তর করতে শেল বা বাহ্যিক প্রোগ্রাম সহ এটি করার অনেকগুলি উপায় রয়েছে:

সঙ্গে :

$ echo $((16#FF))
255

সঙ্গে :

$ echo "ibase=16; FF" | bc
255

সঙ্গে :

$ perl -le 'print hex("FF");'
255

সঙ্গে :

$ printf "%d\n" 0xFF
255

সঙ্গে :

$ python -c 'print(int("FF", 16))'
255

সঙ্গে :

$ ruby -e 'p "FF".to_i(16)'
255

সঙ্গে :

$ nodejs <<< "console.log(parseInt('FF', 16))"
255

সঙ্গে :

$ rhino<<EOF
print(parseInt('FF', 16))
EOF
...
255

সঙ্গে :

$ groovy -e 'println Integer.parseInt("FF",16)'
255

1
কি ? বিসি হ'ল একটি নির্বিচারে নির্ভুলতা ক্যালকুলেটর ভাষা : একটি বাহ্যিক আদেশ।
গিলস কুইনট

10
এবং তাই ? আপনি নিজের প্রশ্নের ধারণাটি পরিবর্তন করার আগে এটি ঠিক আমার 4 টি কমান্ডের উদ্দেশ্য।
গিলস কুইনট

2
printfসমাধান কি পসিক্স? হ্যাঁ, এটা সেরা :)
সিরো Santilli郝海东冠状病六四事件法轮功

3
ব্যাশে আপনি $((0xff))যেমন সি-এর মতো হেক্সস উপসর্গের পরিবর্তে ব্যবহার করতে পারেন 16#, যদিও N#এটি স্পষ্টতই সাধারণ।
রুসলান

3
প্রথম বাশ উদাহরণটি পূর্ণসংখ্যার ওভারফ্লো ত্রুটির পক্ষে সংবেদনশীল, যেমন echo $((077E9F2DBF49D100001#FF))2 ^ 64 এর 64-বিট পূর্ণসংখ্যার সীমাটি ওভারফ্লো করে। bcএটি সঠিকভাবে পরিচালনা করে
রোব্লগিক

39

লিনাক্সে ব্যস্তবক্সের খুব হালকা এম্বেড এম্বেড সংস্করণটির সাথে ডিল করার অর্থ প্রচলিত প্রচলিত কমান্ডগুলি উপলভ্য নয় (বিসি, প্রিন্টফ, ডিসি, পার্ল, পাইথন)

echo $((0x2f))
47

hexNum=2f
echo $((0x${hexNum}))
47

এই সমাধানের জন্য ক্রেডিট পিটার লেউং


1
ঠিক আছে তবে পূর্ণসংখ্যার ওভারফ্লো ত্রুটি থেকে সাবধান থাকুন, যেমন echo $((0x077E9F2DBF49D100001))2 ^ 64 এর 64-বাইট পূর্ণসংখ্যার সীমাটি ওভারফ্লো করে। bcএটি সঠিকভাবে পরিচালনা করে
রোব্লগিক

13

শেলটি ব্যবহার করে এটি করার আরও একটি উপায় (ব্যাশ বা ksh, ড্যাশ দিয়ে কাজ করে না):

echo $((16#FF))
255

কী #প্রতীক মানে? এর ব্যবহার সম্পর্কে আরও পড়ার জন্য কি অন্য কোনও অ্যাপ্লিকেশন বা ডকুমেন্টেশন রয়েছে?
ব্যবহারকারী 1527227

1
এটি এখানে উল্লেখ করা হয়েছে: লিঙ্ক । Section.৫ বিভাগের শেষে এটি বলে: "... সংখ্যাগুলি [বেস #] এন রূপ নিয়েছে, যেখানে alচ্ছিক বেসটি পাটিগণিত বেসকে উপস্থাপন করে 2 এবং 64 এর মধ্যে দশমিক সংখ্যা, এবং n সেই বেসের একটি সংখ্যা। বেস # বাদ দেওয়া হয়, তারপরে বেস 10 ব্যবহার করা হয়। 9 টিরও বেশি সংখ্যাকে সেই ক্রমে ছোট হাতের অক্ষর, বড় হাতের অক্ষর, '@' এবং '_' দ্বারা প্রতিনিধিত্ব করা হয়। যদি বেসটি 36 এর চেয়ে কম বা সমান হয়, ছোট এবং বড় হাতের অক্ষরগুলি 10 থেকে 35 এর মধ্যে সংখ্যার প্রতিনিধিত্ব করতে আন্তরচিকভাবে ব্যবহার করা যেতে পারে ""
টমস ফক্স

11

শেলের মধ্যে থেকে বিভিন্ন সরঞ্জাম আপনার জন্য উপলব্ধ। আপনার প্রাথমিক প্রশ্নের উপর ভিত্তি করে স্পটনিক আপনাকে আপনার বিকল্পগুলির একটি দুর্দান্ত ওভারভিউ দিয়েছে। তিনি আপনাকে একাধিক সঠিক উত্তর দিতে ব্যয় করার জন্য স্পষ্টতই ভোটের দাবিদার।

আরও একটি যা তার তালিকায় নেই:

[ghoti@pc ~]$ dc -e '16i BFCA3000 p'
3217698816

তবে আপনি যদি যা করতে চান তা হ'ল বিয়োগ, কেন ইনপুটটিকে বেস 10 তে পরিবর্তন করতে বিরক্ত করবেন?

[ghoti@pc ~]$ dc -e '16i BFCA3000 17FF - p 10o p'
3217692673
BFCA1801
[ghoti@pc ~]$ 

dcকমান্ড "ডেস্ক Calc" হয়। এটি স্টিডিনের মতো ইনপুটও নেবে, যেমন bc, তবে "ক্রম আদেশ" ব্যবহার না করে এটি স্ট্যাকিং ("বিপরীত পোলিশ") স্বরলিপি ব্যবহার করে। আপনি এটিকে ইনপুট দিন যা এটি একটি স্ট্যাককে যুক্ত করে, তারপরে এটি অপারেটরদের দিয়ে দিন যে প্যাক আইটেমগুলি স্ট্যাকটি সরিয়ে দেয় এবং ফলাফলগুলি পিছনে চাপ দেয়।

উপরের কমান্ডগুলিতে আমরা নিম্নলিখিত পেয়েছি:

  • 16i- ডিসি কে বেস 16 (হেক্সাডেসিমাল) ইনপুট গ্রহণ করতে বলে। আউটপুট বেস পরিবর্তন করে না।
  • BFCA3000 - আপনার প্রাথমিক নম্বর
  • 17FF - আমি আপনার প্রাথমিক নম্বর থেকে বিয়োগ করতে একটি এলোমেলো হেক্স নম্বর
  • - - আমরা যে দুটি সংখ্যা ধাক্কা দিয়েছি সেগুলি নিন এবং পূর্বেরটি থেকে পরে একটিটি বিয়োগ করুন, তারপরে ফলাফলটিকে স্ট্যাকের দিকে পিছনে চাপুন
  • p- স্ট্যাকের শেষ আইটেমটি মুদ্রণ করুন। এটি স্ট্যাক পরিবর্তন করে না, তাই ...
  • 10o - ডিসিকে "10" বেসে তার আউটপুট প্রিন্ট করতে বলে, তবে মনে রাখবেন যে আমাদের ইনপুট নম্বর স্কিমটি বর্তমানে হেক্সাডেসিমাল, সুতরাং "10" এর অর্থ "16"।
  • p - আবার স্ট্যাকের শেষ আইটেমটি মুদ্রণ করুন ... এবার হেক্সে।

আপনি ডিসি দিয়ে কল্পিত জটিল গণিতের সমাধানগুলি তৈরি করতে পারেন। শেল স্ক্রিপ্টগুলির জন্য আপনার টুলবক্সে রাখা ভাল জিনিস।


3

উল্লিখিত ত্রুটিটি যখন ভেরিয়েবলগুলি নাল (বা খালি) হয় তখন উপস্থিত হয়:

$ unset var3 var4; var5=$(($var4-$var3))
bash: -: syntax error: operand expected (error token is "-")

এটি ঘটতে পারে কারণ বিসিকে দেওয়া মানটি ভুল ছিল। এটি ভাল হতে পারে যে বিসি-র জন্য ইউপিপ্র্যাসের মান প্রয়োজন। এটি প্রয়োজন BFCA3000, না bfca3000। এটি সহজে ব্যাশে স্থির করা হয়েছে, কেবল ^^সম্প্রসারণটি ব্যবহার করুন :

var3=bfca3000; var3=`echo "ibase=16; ${var1^^}" | bc`

এটি স্ক্রিপ্টটি এতে পরিবর্তন করবে:

#!/bin/bash

var1="bfca3000"
var2="efca3250"

var3="$(echo "ibase=16; ${var1^^}" | bc)"
var4="$(echo "ibase=16; ${var2^^}" | bc)"

var5="$(($var4-$var3))"

echo "Diference $var5"

তবে বিসি ব্যবহার করার দরকার নেই [1], কারণ বাশ সরাসরি অনুবাদ এবং বিয়োগফল সম্পাদন করতে পারে:

#!/bin/bash

var1="bfca3000"
var2="efca3250"

var5="$(( 16#$var2 - 16#$var1 ))"

echo "Diference $var5"

[1] দ্রষ্টব্য: আমি ধরে নিচ্ছি যে মানগুলি bit৪ বিট গণিতে উপস্থাপিত হতে পারে, কারণ আপনার মূল স্ক্রিপ্টে পার্থক্যটি ব্যাশে গণনা করা হয়েছিল। বাশ 64৪ বিটে সংকলিত হলে ((২ ** 63) -1) এর চেয়ে কম পূর্ণসংখ্যায় সীমাবদ্ধ। বিসি-র সাথে এটিই কেবল তফাত হবে যার সীমা নেই।


3

ড্যাশ এবং অন্যান্য শেলগুলিতে আপনি ব্যবহার করতে পারেন

printf "%d\n" (your hexadecimal number)

একটি হেক্সাডেসিমাল সংখ্যা দশমিক রূপান্তর করতে। এটি বাশ, বা ksh নির্দিষ্ট নয়।


1
উদাহরণস্বরূপprintf "%d" 0xff
লাশগার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.