দশমিক থেকে হেক্সে বেস বেস রূপান্তর


29

বাশ-এ, দশমিক থেকে অন্য বেসে কীভাবে বেস রূপান্তর করে? অন্যভাবে যাওয়া সহজ বলে মনে হচ্ছে:

$ echo $((16#55))
85

একটি ওয়েব-অনুসন্ধানের মাধ্যমে, আমি একটি স্ক্রিপ্ট পেয়েছি যা রূপান্তরটি করতে গণিত এবং চরিত্রের কারসাজি করে এবং আমি এটি একটি ফাংশন হিসাবে ব্যবহার করতে পারি, তবে আমি ভেবেছিলাম যে ইতিমধ্যে বাশটির একটি অন্তর্নির্মিত বেস রূপান্তর থাকবে - এটা কি পারে?


উত্তর:


35

সঙ্গে bash(অথবা উপলব্ধ কোনো শেল, printfকমান্ড পাওয়া যায় (একটি প্রমিত POSIX প্রায়ই শাঁস সালে নির্মিত কমান্ড)):

printf '%x\n' 85

সহ zsh, আপনি এটি করতে পারেন:

dec=85
hex=$(([##16]dec))

এটি 2 থেকে 36 পর্যন্ত বেসগুলির জন্য কাজ করে ( 0-9a-zঅঙ্ক হিসাবে সংবেদনশীল ক্ষেত্রে)।

সহ ksh93, আপনি ব্যবহার করতে পারেন:

dec=85
base54=$(printf %..54 "$dec")

যা 2 থেকে 64 অবধিগুলির জন্য কাজ করে ( 0-9a-zA-Z@_অঙ্কগুলি হিসাবে)।

সাথে kshএবং zsh, এছাড়াও রয়েছে:

$ typeset -i34 x=123; echo "$x"
34#3l

যদিও এটি ksh88, zsh এবং pdksh এ 36 এবং ksh93 এ 64 অবধি সীমাবদ্ধ।

নোট করুন যে সেগুলি longআপনার সিস্টেমে পূর্ণসংখ্যার আকারের মধ্যে সীমাবদ্ধ ( intকয়েকটি শেলের সাথে)। বড় কিছু জন্য, আপনি ব্যবহার করতে পারেন bcবা dc

$ echo 'obase=16; 9999999999999999999999' | bc
21E19E0C9BAB23FFFFF
$ echo '16o 9999999999999999999999 p' | dc
21E19E0C9BAB23FFFFF

পোজিক্স দ্বারা কমপক্ষে 99 এর চেয়ে বেশি হওয়া 2 থেকে কিছু সংখ্যক সমান সমর্থিত বেসগুলি সহ 16 টিরও বেশি ঘাঁটিগুলির জন্য, 9 টিরও বেশি সংখ্যাকে স্পেস-বিভাজিত 0-প্যাডযুক্ত দশমিক সংখ্যা হিসাবে উপস্থাপন করা হয়।

$ echo 'obase=30; 123456' | bc
 04 17 05 06

বা এর সাথে একই dc(প্রায় bcব্যবহৃত (এবং এখনও কিছু সিস্টেমে রয়েছে) চারপাশে একটি র‍্যাপার dc):

$ echo 30o123456p | dc
 04 17 05 06

ধন্যবাদ। ঠিক আমি খুঁজছেন ছিল কি. (এবং বিব্রতকরভাবে সহজ।)
ডেভ রোভ

আপনি যদি সুনির্দিষ্ট বেসটি করতে চান তবে আপনি কী করতে চান #?
flarn2006

@ flarn2006। সঙ্গে bashbuiltins, আপনি পারেন ইনপুট কোনো বেস সংখ্যা, কিন্তু না 8, 10 এবং 16 অন্যান্য ঘাঁটি জন্য ছাড়া অন্য কোনো বেস মধ্যে আউটপুট, আপনি মত অন্য শেল প্রয়োজন চাই zshবা kshবা ব্যবহারের bc/dc
স্টাফেন চেজেলাস

1
@ স্টাফেনচেজেলাস আসলেই? এ রকম এক অদ্ভুত। প্রায় দেখে মনে হচ্ছে তারা এটির জন্য বা কোনও কিছুর জন্য একটি সিনট্যাক্সে প্রোগ্রাম করতে খুব অলস ছিল; ইনপুটিং প্রয়োগ করে কোনও বেসে আউটপুট দেওয়ার ধারণা তাদের মন অতিক্রম না করার উপায় নেই।
flarn2006

alias hex="printf '%x\n'"
mwfearnley

5

প্রিন্টফ ব্যবহার করুন:

$ printf "%d %x\n" $((16#55)) $((10#85))
85 55

একটি চলক ব্যবহার কমান্ড প্রতিস্থাপনের মান নির্ধারণ করতে:

$ x=$( printf "%x" 85 ) ; echo $x
55

4
বা, -vprintf -v foo "%d" $((16#BEEF)); echo $foo
বিল্টিন প্রিন্টফের

@ গ্লেন অ-মানক বিকল্পগুলি (যেমন -v) ব্যবহার করা এখানে অপ্রয়োজনীয়; আমি এড়াতে চাই।
জ্যানিস

3
-vকাঁটাচামচ এবং পাইপ এড়ানো হবে (ব্যাশে, ksh93 নয় যা এখানে বিল্টিন হিসাবে কাঁটাচামচ করবে না printf)। নোট যে $((16#55))মান হয় না।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস, এক মিনিট অপেক্ষা করুন। আপনি কি বলছেন যে ksh93 কাঁটাচামচ করে না x=$(some_builtin)?
গ্লেন জ্যাকম্যান

1
@glennjackman, হ্যাঁ, এটি কেবল বাহ্যিক আদেশগুলি কার্যকর করার জন্য জালিয়াতি করে।
স্টাফেন চেজেলাস

2

সমস্ত পসিক্স অনুগত শেলগুলিতে উপস্থিত অন্তর্নির্মিত গাণিতিক সম্প্রসারণ বিকল্পটি ব্যবহার করুন - যা আজকাল বেশ সার্বজনীন।

$ echo $((0xbc))
188

এবং

$ hex=dead
$ dec=$((0x$hex))
$ echo $dec
57005

সতর্কতা: বিশেষত শেষ উদাহরণে প্রসারণটি অপ্রত্যাশিত ফলাফলের কারণ হতে পারে - ভেরিয়েবল 'হেক্স'-এর হেক্স অঙ্কগুলি একটি আইনী হেক্স ধ্রুবক গঠন করতে পারে, অন্যথায় সম্ভাব্য অস্পষ্ট ত্রুটি বার্তাগুলি ঘটে। উদাহরণস্বরূপ, যদি 'হেক্স' '0xdead' হয়, অঙ্কগুলি গাণিতিক সম্প্রসারণ 0x0xdead হয়ে যেত, যা ধ্রুবক হিসাবে ব্যাখ্যাযোগ্য নয়। অবশ্যই, সেই ক্ষেত্রে গাণিতিক সম্প্রসারণ $ (($ hex)) কৌশলটি করবে। পাঠকের পক্ষে সাধারণ সাবস্ট্রিং প্রসেসিং প্যাটার্ন ম্যাচিং তৈরি করা অনুশীলন হিসাবে ছেড়ে দেওয়া হয়েছে যা একটি alচ্ছিক '0x' উপসর্গটি সরিয়ে ফেলবে।


4
আপনি ওপি তার উদাহরণে ঠিক একই জিনিস করছেন; তিনি বিপরীত অপারেশন খুঁজছেন ।
টমাস গিয়ট-সিওনেস্ট

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