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



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



printf? Мерзость! Используя его сейчас, но что еще доступно?

633   10  

10 ответов:

echo "obase=16; 34" | bc

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

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

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

printf "%x\n" 34
22

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

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

$ echo $((0xfee10000))
4276158464

десятичной в шестнадцатеричную:

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

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

извините мою ошибку, попробуйте это...

#!/bin/bash
:

declare -r HEX_DIGITS="0123456789ABCDEF"

dec_value=
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

попробуй:

printf "%X\n" ${MY_NUMBER}

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

Я считаю, что Баш имеет аналогичные возможности.

# 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

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

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

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

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

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

Comments

    Ничего не найдено.