Convert decimal to hexadecimal in UNIX shell script

UnixShellHex

Unix Problem Overview


In a UNIX shell script, what can I use to convert decimal numbers into hexadecimal? I thought od would do the trick, but it's not realizing I'm feeding it ASCII representations of numbers.

printf? Gross! Using it for now, but what else is available?

Unix Solutions


Solution 1 - Unix

Tried printf(1)?

printf "%x\n" 34
22

There are probably ways of doing that with builtin functions in all shells but it would be less portable. I've not checked the POSIX sh specs to see whether it has such capabilities.

Solution 2 - Unix

echo "obase=16; 34" | bc

If you want to filter a whole file of integers, one per line:

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

Solution 3 - Unix

Hexidecimal to decimal:

$ echo $((0xfee10000))
4276158464

Decimal to hexadecimal:

$ printf '%x\n' 26
1a

Solution 4 - Unix

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

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

Solution 5 - Unix

Sorry my fault, try this...

#!/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}"

Example:

$ ./dtoh 1024
400

Solution 6 - Unix

Try:

printf "%X\n" ${MY_NUMBER}

Solution 7 - Unix

In zsh you can do this sort of thing:

% 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

Example taken from zsh docs page about Arithmetic Evaluation.

I believe Bash has similar capabilities.

Solution 8 - Unix

In my case, I stumbled upon one issue with using printf solution:

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

The easiest way was to use solution with bc, suggested in post higher:

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

Solution 9 - Unix

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
}

Solution 10 - Unix

# 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
 

Solution 11 - Unix

This is not a shell script, but it is the cli tool I'm using to convert numbers among bin/oct/dec/hex:

    #!/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);
    }

Solution 12 - Unix

SHELL SCRIPTING
LINUX

For those who would like to use variables, first export it by running, export NUM=100.
Then run:

printf "%x\n" $NUM

Else, you can you can ignore the use case of the variables and run it directly as shown below:

printf "%x\n" 100

NB:Substitute NUM with the variable name of your choice.
Exporting makes it an environmental variable(global).

Solution 13 - Unix

Wow, I didn't realize that printf was available at the shell!

With that said, I'm surprised no-one commented about putting the printf into a shell script (which then you could put in your personal bin directory if you wanted).

echo "printf "0x%x\n" $1" > hex chmod +x hex

Now just run: ./hex 123

It returns: 0x7b

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionskiphoppyView Question on Stackoverflow
Solution 1 - UnixKeltiaView Answer on Stackoverflow
Solution 2 - UnixBill KarwinView Answer on Stackoverflow
Solution 3 - UnixpjhobbsView Answer on Stackoverflow
Solution 4 - UnixOrwellophileView Answer on Stackoverflow
Solution 5 - UnixpjhobbsView Answer on Stackoverflow
Solution 6 - UnixRob WellsView Answer on Stackoverflow
Solution 7 - UnixAlastairView Answer on Stackoverflow
Solution 8 - UnixDaniel JeznachView Answer on Stackoverflow
Solution 9 - UnixsjasView Answer on Stackoverflow
Solution 10 - Unixamol s. patilView Answer on Stackoverflow
Solution 11 - UnixCodyChanView Answer on Stackoverflow
Solution 12 - UnixEmmanuel ChaloView Answer on Stackoverflow
Solution 13 - UnixAaron VolzView Answer on Stackoverflow