Преобразование десятичного числа в шестнадцатеричное в сценарии оболочки UNIX - PullRequest
98 голосов
/ 18 декабря 2008

Что можно использовать в сценарии оболочки UNIX для преобразования десятичных чисел в шестнадцатеричные? Я думал, что od сделает свое дело, но он не понимает, что я передаю ASCII представления чисел.

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

Ответы [ 10 ]

170 голосов
/ 18 декабря 2008

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

printf "%x\n" 34
22

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

100 голосов
/ 19 декабря 2008
echo "obase=16; 34" | bc

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

( echo "obase=16" ; cat file_of_integers ) | bc
63 голосов
/ 15 декабря 2009

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

$ echo $((0xfee10000))
4276158464

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

$ printf '%x\n' 26
1a
15 голосов
/ 02 мая 2012
bash-4.2$ printf '%x\n' 4294967295
ffffffff

bash-4.2$ printf -v hex '%x' 4294967295
bash-4.2$ echo $hex
ffffffff
4 голосов
/ 12 марта 2010

Извините, я виноват, попробуйте это ...

#!/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
3 голосов
/ 19 декабря 2008

В 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 страницы документации об арифметической оценке .

Я считаю, что у Bash есть подобные возможности.

2 голосов
/ 18 декабря 2008

Попробуйте:

printf "%X\n" ${MY_NUMBER}
1 голос
/ 09 февраля 2016

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

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

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

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

1 голос
/ 28 августа 2014
# 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
0 голосов
/ 23 августа 2018

Это не скрипт оболочки, но это инструмент 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...