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


110

UNIX शेल स्क्रिप्ट में, मैं दशमलव संख्याओं को हेक्साडेसिमल में बदलने के लिए क्या उपयोग कर सकता हूं? मैंने सोचा था कि ओडी ट्रिक करेगा, लेकिन मुझे यह एहसास नहीं हो रहा है कि मैं इसे ASCII संख्याओं का प्रतिनिधित्व कर रहा हूं।

printf? कुल! अभी के लिए इसका उपयोग करना, लेकिन और क्या उपलब्ध है?


8
मुझे पूछना है, प्रिंटफ के बारे में क्या सकल है? कई सामान्य प्रोग्रामिंग भाषाएं प्रिंटफ़-जैसे फ़ॉर्मेटिंग का समर्थन करती हैं, इसलिए नीचे दिए गए प्रिंटफ़ समाधान निश्चित रूप से डेवलपर्स को समझने में सबसे आसान होंगे।
माइकल शेपर

4
लड़का, मुझे नहीं पता - वह पांच साल पहले था! मुझे लगता है कि शायद मुझे लगा कि यह सच नहीं है।
स्किप्पॉपी

जवाबों:


108
echo "obase=16; 34" | bc

यदि आप पूर्णांक की पूरी फ़ाइल को फ़िल्टर करना चाहते हैं, तो प्रति पंक्ति एक:

( echo "obase=16" ; cat file_of_integers ) | bc

1
मैंने बीसी (1) और डीसी (1) दोनों को देखा और उस एक को याद किया।
काल्टिया

3
@skiphoppy: यदि आप लिखते हैं: इको "ओबेस = 16; 12 34 56" | bc आपको 1E240 मिलता है, ठीक वैसे ही जैसे आपने लिखा है: echo "obase = 16; 123456" | बीसी। तो एक पंक्ति में सभी पूर्णांकों की मनमानी संख्याओं से निपटने का तरीका प्रत्येक संख्या को अपनी पंक्ति में रखना है: tr '' '\ 015' <input | bc (newlines के लिए रिक्त स्थान)
जोनाथन लेफ्लर

1
यह बहुत अच्छा है यदि आप 'bc' के लिए होते हैं, लेकिन 'printf' अपने आप ही bash का हिस्सा है
fuzzyTew

1
@ कार्ल, या zsh, या बिजीबॉक्स, लेकिन शायद कुछ शेल नहीं जो मैंने कोशिश नहीं की है? मैं सादा श अब स्थापित नहीं करता हूं, लेकिन स्पष्ट रूप से स्किपहॉप्पी की तलाश में हैं कि अन्य विकल्प क्या हैं
fuzzyTew

2
@ श्रीधर-सरनोबत, यह हेक्साडेसिमल का दशमलव है। मुझे लगता है कि आप मतलब है कि हेक्स कन्वर्ट करने के लिए। ऐसा करने के लिए, सेट करें ibase=16। आप अधिक जानकारी के लिए bc पर मैनुअल पढ़ना पसंद कर सकते हैं ।
बिल कारविन

186

कोशिश की printf(1)?

printf "%x\n" 34
22

वहाँ शायद सभी गोले में अंतर्निहित कार्यों के साथ करने के तरीके हैं, लेकिन यह कम पोर्टेबल होगा। मैंने यह देखने के लिए कि क्या इस तरह की क्षमताएं हैं POSIX शेक को चेक नहीं किया है।


5
यह प्रिंट की तुलना में बहुत अधिक POSIX नहीं मिलता है। यह "श" में भी काम करता है।
ऑरवेलोफाइल

4
प्रिंटफ़ बहुत सटीक नहीं है। bcहै। उदाहरण के लिए, 238862874857408875879219909679752457540इनपुट के रूप में, प्रिंटफ़ हमें "परिणाम बहुत बड़ा" देता है। ईसा पूर्व विधि मानक int / long / bigint से बड़ी चीजों के लिए बहुत अच्छा काम करती है
एंड्रयू बैकर

3
और, यदि आप हेक्स में अपरकेस अक्षर चाहते हैं, तो printf "%X"अपरकेस एक्स के साथ प्रयोग करें।
andrybak

3
और "0x00" जैसे आउटपुट को मजबूर करने के लिए, आप printf "0x%
02X

1
... और bcहर जगह उपलब्ध नहीं है (कम से कम मेरे एम्बेडेड लिनक्स पर नहीं)।
Matthieu

69

हेक्सिडेसिमल दशमलव के लिए:

$ echo $((0xfee10000))
4276158464

दशमलव से हेक्साडेसिमल:

$ printf '%x\n' 26
1a

15
bash-4.2$ printf '%x\n' 4294967295
ffffffff

bash-4.2$ printf -v hex '%x' 4294967295
bash-4.2$ echo $hex
ffffffff

1
-v VARएक बैश एक्सटेंशन है। मैन पेज में उल्लेख नहीं किया गया है , केवल तभी पता चलता है जब printfकोई तर्क के बिना कहता है
एड्रियन डब्ल्यू

5

क्षमा करें मेरी गलती, यह प्रयास करें ...

#!/bin/bash
:

declare -r HEX_DIGITS="0123456789ABCDEF"

dec_value=$1
hex_value=""

until [ $dec_value == 0 ]; do

    rem_value=$((dec_value % 16))
    dec_value=$((dec_value / 16))

    hex_digit=${HEX_DIGITS:$rem_value:1}

    hex_value="${hex_digit}${hex_value}"

done

echo -e "${hex_value}"

उदाहरण:

$ ./dtoh 1024
400

1
धन्यवाद इस ने env के लिए बहुत मदद की। जहाँ printfऔर hexआदेश उपलब्ध नहीं हैं।
बेंच

2
@benchuk कहाँ printfउपलब्ध नहीं है?
Matthieu


3

में zshआप बात की इस तरह कर सकते हैं:

% typeset -i 16 y
% print $(( [#8] x = 32, y = 32 ))
8#40
% print $x $y
8#40 16#20
% setopt c_bases
% print $y
0x20

उदाहरण zshअंकगणित मूल्यांकन के बारे में डॉक्स पृष्ठ से लिया गया है ।

मेरा मानना ​​है कि बैश में समान क्षमताएं हैं।


2

मेरे मामले में, मैंने प्रिंटफ़ समाधान के उपयोग से एक मुद्दे पर ठोकर खाई:

$ printf "%x" 008 bash: printf: 008: invalid octal number

बीसी के साथ समाधान का उपयोग करने का सबसे आसान तरीका था , उच्चतर पोस्ट में सुझाव दिया गया था:

$ bc <<< "obase=16; 008" 8


वर्षों पहले लिखे गए लोगों के लिए आपका समाधान क्या जोड़ता है?
Matthieu

1
@ मैथ्यू यह प्रमुख शून्य के साथ संख्याओं के मुद्दे का उल्लेख करता है, जो बैश प्रिंटफ अनपेक्षित रूप से अष्टक के रूप में व्याख्या करता है, और एक समाधान प्रदर्शित करता है जो समस्या से बचा जाता है।
mwfearnley

2
xd() {
    printf "hex> "
    while read i
    do
        printf "dec  $(( 0x${i} ))\n\nhex> "
    done
}
dx() {
    printf "dec> "
    while read i
    do
        printf 'hex  %x\n\ndec> ' $i
    done
}

1
# number conversion.

while `test $ans='y'`
do
    echo "Menu"
    echo "1.Decimal to Hexadecimal"
    echo "2.Decimal to Octal"
    echo "3.Hexadecimal to Binary"
    echo "4.Octal to Binary"
    echo "5.Hexadecimal to  Octal"
    echo "6.Octal to Hexadecimal"
    echo "7.Exit"

    read choice
    case $choice in

        1) echo "Enter the decimal no."
           read n
           hex=`echo "ibase=10;obase=16;$n"|bc`
           echo "The hexadecimal no. is $hex"
           ;;

        2) echo "Enter the decimal no."
           read n
           oct=`echo "ibase=10;obase=8;$n"|bc`
           echo "The octal no. is $oct"
           ;;

        3) echo "Enter the hexadecimal no."
           read n
           binary=`echo "ibase=16;obase=2;$n"|bc`
           echo "The binary no. is $binary"
           ;;

        4) echo "Enter the octal no."
           read n
           binary=`echo "ibase=8;obase=2;$n"|bc`
           echo "The binary no. is $binary"
           ;;

        5) echo "Enter the hexadecimal no."
           read n
           oct=`echo "ibase=16;obase=8;$n"|bc`
           echo "The octal no. is $oct"
           ;;

        6) echo "Enter the octal no."
           read n
           hex=`echo "ibase=8;obase=16;$n"|bc`
           echo "The hexadecimal no. is $hex"
           ;;

        7) exit 
        ;;
        *) echo "invalid no." 
        ;;

    esac
done

1

यह एक शेल स्क्रिप्ट नहीं है, लेकिन यह cli टूल है जिसका उपयोग मैं संख्याओं को बिन / ऑक्टो / डेक्स / हेक्स के बीच परिवर्तित करने के लिए कर रहा हूं:

    #!/usr/bin/perl

    if (@ARGV < 2) {
      printf("Convert numbers among bin/oct/dec/hex\n");
      printf("\nUsage: base b/o/d/x num num2 ... \n");
      exit;
    }

    for ($i=1; $i<@ARGV; $i++) {
      if ($ARGV[0] eq "b") {
                    $num = oct("0b$ARGV[$i]");
      } elsif ($ARGV[0] eq "o") {
                    $num = oct($ARGV[$i]);
      } elsif ($ARGV[0] eq "d") {
                    $num = $ARGV[$i];
      } elsif ($ARGV[0] eq "h") {
                    $num = hex($ARGV[$i]);
      } else {
                    printf("Usage: base b/o/d/x num num2 ... \n");
                    exit;
      }
      printf("0x%x = 0d%d = 0%o = 0b%b\n", $num, $num, $num, $num);
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.