शेल स्क्रिप्ट में हेक्साडेसिमल को दशमलव में


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 "-")

दूसरी तरह के आसपास: stackoverflow.com/questions/378829/… । अनिवार्य रूप से एक ही उपकरण। और संभावित क्रॉस साइट डुप्लिकेट की डुप्लिकेट: superuser.com/questions/226163/…
Ciro Santilli 病 of of of

जवाबों:


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
क्या ? bc एक मनमाना परिशुद्धता कैलकुलेटर भाषा है : एक बाहरी कमांड।
गाइल्स क्वांनोट

10
इसलिए ? आपके प्रश्न की भावना को संशोधित करने से पहले यह मेरे 4 आदेशों का उद्देश्य है।
गाइल्स क्वेनोट

2
क्या printfसमाधान POSIX है? यदि हाँ, तो यह सबसे अच्छा है :)
Ciro Santilli 冠状 best best best

3
बैश में आप इसका उपयोग भी कर सकते हैं $((0xff)), यानी सी-जैसे हेक्स उपसर्ग के बजाय 16#, हालांकि N#स्पष्ट रूप से अधिक सामान्य है।
रुस्लान

3
पहला बैश उदाहरण पूर्णांक त्रुटि के लिए अतिसंवेदनशील है, उदाहरण echo $((077E9F2DBF49D100001#FF))के लिए 2 ^ 64 की 64-बिट पूर्णांक सीमा को ओवरफ्लो करता है। bcइसे ठीक से संभालता है।
roblogic

39

लिनक्स पर बिजीबॉक्स के बहुत हल्के एम्बेडेड संस्करण से निपटने का मतलब है कि कई पारंपरिक कमांड उपलब्ध नहीं हैं (bc, printf, dc, perl, python)

echo $((0x2f))
47

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

इस समाधान के लिए पीटर ल्यूंग को श्रेय ।


1
ठीक है, लेकिन पूर्णांक ओवरफ्लो त्रुटि से सावधान रहें, उदाहरण echo $((0x077E9F2DBF49D100001))के लिए 2 ^ 64 के 64-बायिट पूर्णांक सीमा को ओवरफ्लो करता है। bcइस ठीक से हैंडल
roblogic

13

शेल (बैश या ksh, डैश के साथ काम नहीं करता) का उपयोग करने का एक और तरीका:

echo $((16#FF))
255

#प्रतीक का क्या अर्थ है? क्या इसके उपयोग के बारे में अधिक पढ़ने के लिए कोई अन्य अनुप्रयोग या दस्तावेज हैं?
user1527227

1
इसका उल्लेख यहां दिया गया है: लिंक । खंड ६.५ के अंत में यह कहते हैं: "... संख्याएं फॉर्म [आधार #] n लेती हैं, जहां वैकल्पिक आधार २ और ६४ के बीच एक दशमलव संख्या है जो अंकगणितीय आधार का प्रतिनिधित्व करता है, और 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 (हेक्साडेसिमल) में इनपुट स्वीकार करने के लिए dc बताता है। आउटपुट बेस नहीं बदलता है।
  • BFCA3000 - आपका प्रारंभिक नंबर
  • 17FF - एक यादृच्छिक हेक्स संख्या जिसे मैंने आपके शुरुआती नंबर से घटाया था
  • - - जिन दो नंबरों को हमने पुश किया है, उन्हें लें और बाद वाले को पहले वाले से घटाएं, फिर परिणाम को स्टैक पर वापस लाएं
  • p- स्टैक पर अंतिम आइटम प्रिंट करें। यह स्टैक नहीं बदलता है, इसलिए ...
  • 10o - डीसी को इसके आउटपुट को "10" में प्रिंट करने के लिए कहता है, लेकिन याद रखें कि हमारी इनपुट नंबरिंग योजना वर्तमान में हेक्साडेसिमल है, इसलिए "10" का अर्थ "16" है।
  • p - स्टैक पर अंतिम आइटम को फिर से प्रिंट करें ... इस बार हेक्स में।

आप डीसी के साथ fabulously जटिल गणित समाधान का निर्माण कर सकते हैं। शेल स्क्रिप्ट के लिए आपके टूलबॉक्स में होना अच्छी बात है।


3

रिपोर्ट की गई त्रुटि तब दिखाई देती है जब चर शून्य (या खाली) होते हैं:

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

ऐसा इसलिए हो सकता है क्योंकि bc को दिया गया मूल्य गलत था। यह अच्छी तरह से हो सकता है कि bc को UPPERcase मानों की आवश्यकता है। इसकी जरूरत है 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"

लेकिन bc [1] का उपयोग करने की कोई आवश्यकता नहीं है, क्योंकि bash सीधे अनुवाद और विकल्प का प्रदर्शन कर सकता है:

#!/bin/bash

var1="bfca3000"
var2="efca3250"

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

echo "Diference $var5"

[१] नोट: मैं मान रहा हूं कि मूल्यों को ६४ बिट गणित में दर्शाया जा सकता है, क्योंकि अंतर की गणना आपकी मूल लिपि में बैश में की गई थी। बैश 64 बिट में संकलित होने पर (2 ** 63) -1 से कम पूर्णांक तक सीमित है। बीसी के साथ केवल यही अंतर होगा जिसकी ऐसी सीमा नहीं है।


3

डैश और अन्य गोले में, आप उपयोग कर सकते हैं

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

एक हेक्साडेसिमल संख्या को दशमलव में बदलने के लिए। यह बैश, या ksh, विशिष्ट नहीं है।


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