बैश बेस रूपांतरण दशमलव से हेक्स तक


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

POSIX द्वारा आवश्यक 2 से लेकर कुछ संख्या तक समर्थित आधारों के साथ कम से कम 99 के रूप में उच्च होने के लिए। 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) का उपयोग करना यहाँ अनावश्यक है; मैं इससे बचूंगा।
Janis

3
-vकांटा और पाइप से बचना चाहिए (बाश में, ksh93 नहीं जो यहां बनाया गया कांटा नहीं होगा printf)। ध्यान दें कि $((16#55))मानक नहीं है।
स्टीफन चेजलस

@ स्टीफनचेज़लस, एक मिनट रुको। क्या आप कह रहे हैं कि ksh93 के लिए कांटा नहीं है x=$(some_builtin)?
ग्लेन जैकमैन

1
@glennjackman, हाँ, यह केवल बाहरी आदेशों को निष्पादित करने के लिए कांटे देता है।
स्टीफन चेज़लस

2

सभी POSIX अनुरूप गोले में मौजूद अंतर्निहित अंकगणितीय विस्तार प्रतिस्थापन का उपयोग करें - जो इन दिनों बहुत अधिक सार्वभौमिक है।

$ echo $((0xbc))
188

तथा

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

चेतावनी: विशेष रूप से अंतिम उदाहरण में विस्तार अप्रत्याशित परिणाम दे सकता है - चर 'हेक्स' में हेक्स अंकों को एक कानूनी हेक्स स्थिरांक बनाना होता है, अन्यथा संभावित अस्पष्ट त्रुटि संदेश होते हैं। उदाहरण के लिए यदि 'हेक्स' '0xdead' होता, तो अंकगणितीय विस्तार 0x0xdead बन जाता, जो कि एक स्थिरांक के रूप में व्याख्या करने योग्य नहीं है। बेशक, उस स्थिति में अंकगणित का विस्तार $ (($ हेक्स)) करेगा। यह एक वैकल्पिक '0x' उपसर्ग को हटा देगा कि मिलान के सरल प्रतिस्थापन प्रसंस्करण पैटर्न बनाने के लिए एक अभ्यास के रूप में छोड़ दिया जाता है।


4
आप ठीक वही काम कर रहे हैं जो ओपी ने अपने उदाहरण में किया था; वह रिवर्स ऑपरेशन की तलाश कर रहा है।
थॉमस गुयोट-सायननेस्ट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.