Преобразование десятичного в шестнадцатеричный в оболочке UNIX script

В оболочке UNIX script, что я могу использовать для преобразования десятичных чисел в шестнадцатеричный? Я думал, что это сделает трюк, но это не означает, что я кормлю его ASCII-представлениями чисел.

Printf? Валовой! Используя это сейчас, но что еще доступно?

Ответ 1

echo "obase=16; 34" | bc

Если вы хотите отфильтровать целый файл целых чисел, по одному в строке:

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

Ответ 2

Пробовал printf(1)?

printf "%x\n" 34
22

Вероятно, есть способы сделать это со встроенными функциями во всех оболочках, но он будет менее переносимым. Я не проверял спецификации POSIX sh, чтобы увидеть, есть ли у него такие возможности.

Ответ 3

От шестнадцатеричного до десятичного:

$ echo $((0xfee10000))
4276158464

Десятичное в шестнадцатеричное:

$ printf '%x\n' 26
1a

Ответ 4

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

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

Ответ 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

Ответ 6

Try:

printf "%X\n" ${MY_NUMBER}

Ответ 8

# 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

Ответ 9

Это не скрипт оболочки, но это инструмент cli, который я использую для преобразования чисел в 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);
    }

Ответ 10

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
}

Ответ 11

В моем случае я наткнулся на одну проблему с использованием решения printf:

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

Самый простой способ - использовать решение с bc, предложенное в post выше:

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