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

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

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

 Michael Scheper29 нояб. 2013 г., 01:30
Я должен спросить, что общего в printf? Многие распространенные языки программирования поддерживают форматирование, похожее на printf, поэтому приведенные ниже решения для printf наверняка будут проще понять разработчикам.
 skiphoppy06 дек. 2013 г., 04:36
Мальчик, я не знаю - это было пять лет назад! Я думаю, может быть, я думал, что это не настоящая оболочка или что-то в этом роде.

Ответы на вопрос(10)

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

bash-4.2$ printf -v hex '%x' 4294967295
bash-4.2$ echo $hex
ffffffff
 Matthieu17 авг. 2018 г., 18:51
проголосовал за-v VAR
 Adrian W24 окт. 2018 г., 12:19
-v VAR это расширение bash. Не упоминается всправочная страницаРаскрывается только если один звонитprintf без аргументов
# 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

Это не сценарий оболочки, но это инструмент 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);
    }

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

#!/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
 Matthieu17 авг. 2018 г., 18:52
@benchuk где находитсяprintf недоступен?
 benchuk04 янв. 2015 г., 08:16
Спасибо, это очень помогло для env. гдеprintf а такжеhex Команды недоступны.

Пыталсяprintf(1)?

printf "%x\n" 34
22

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

 gbetous18 дек. 2017 г., 08:02
И для принудительного вывода, например, «0x00», вы можете использовать printf «0x% 02X»
 Matthieu17 авг. 2018 г., 18:37
... а такжеbc не доступен везде (по крайней мере, на моем встроенном Linux).
 Orwellophile12 мая 2012 г., 00:50
Это не намного больше POSIX, чем printf. Это даже работает в "ш".
 Matthieu17 авг. 2018 г., 18:38
И не забывайте-v VAR как вprintf -v VAR "%x" 34 && echo $VAR
 Andrew Backer01 сент. 2014 г., 08:52
printf не совсем точный.bc является. например, принимая238862874857408875879219909679752457540 в качестве входных данных printf выдает «Результат слишком велик». метод BC отлично подходит для вещей, которые больше стандартного int / long / bigint
 Lekensteyn19 февр. 2011 г., 12:13
Отлично, мне нужно было преобразовать адрес IPv4 в IPv6, это работает!
 andrybak30 сент. 2015 г., 13:34
И, если вы хотите заглавные буквы в шестнадцатеричном, используйтеprintf "%X" с заглавной буквы X.

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

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

Самый простой способ был использовать решение сДо нашей эрыПредложено в посте выше:

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

 Matthieu17 авг. 2018 г., 18:53
Что ваше решение добавляет к тем, которые были написаны годами ранее?
Решение Вопроса
echo "obase=16; 34" | bc

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

( echo "obase=16" ; cat file_of_integers ) | bc
 graywolf18 авг. 2016 г., 13:18
Вы хотели бы добавить, что bc чувствителен к регистру. имея в видуecho "ibase=16; dead" | bc не получится, нужно сделатьecho "ibase=16; DEAD" | bcЯ был немного удивлен этим
 skiphoppy19 дек. 2008 г., 03:00
Любой способ превратить его в фильтр, который будет принимать произвольное количество целых чисел, все в одной строке?
 fuzzyTew12 июл. 2013 г., 12:29
Это замечательно, если у вас есть «bc», но «printf» является частью самого bash
 Bill Karwin12 июл. 2013 г., 19:06
@fuzzyTew, конечно, это правда. Но только если у вас есть Bash. :-)
 Sridhar Sarnobat27 мая 2015 г., 22:35
Мне нравится аспект трубопровода, но как ты делаешь обратное? От десятичного до шестнадцатеричного?
 Jonathan Leffler25 дек. 2008 г., 21:40
@skiphoppy: Если вы напишите: echo "obase = 16; 12 34 56" | bc вы получаете 1E240, точно так же, как если бы вы написали: echo "obase = 16; 123456" | До нашей эры. Таким образом, способ работы с произвольными числами целых чисел в одной строке состоит в том, чтобы поместить каждое число в отдельную строку: tr '' '\ 015' <input | bc (отображать пробелы в новые строки).
 Keltia18 дек. 2008 г., 22:58
Я посмотрел на bc (1) и dc (1) и пропустил это.
 fuzzyTew13 июл. 2013 г., 23:48
@ Билл Карвин, или Zsh, или busybox, но, может быть, не какая-то оболочка, которую я не пробовал? Я не держу простой sh установленным, но ясно skiphoppy ищет другие варианты, которые есть
 Bill Karwin28 мая 2015 г., 03:58
@ Шридхар-Сарнобат, этоявляется десятичное в шестнадцатеричное. Я предполагаю, что вы имеете в виду конвертировать гекс в декабрь. Для этого установитеibase=16, Вы можете прочитатьруководство по до нашей эры Больше подробностей.

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

$ echo $((0xfee10000))
4276158464

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

$ printf '%x\n' 26
1a

В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 имеет аналогичные возможности.

Пытаться:

printf "%X\n" ${MY_NUMBER}

Ваш ответ на вопрос