programing tip

UNIX 쉘 스크립트에서 10 진수를 16 진수로 변환

itbloger 2020. 8. 17. 08:21
반응형

UNIX 쉘 스크립트에서 10 진수를 16 진수로 변환


UNIX 쉘 스크립트에서 10 진수를 16 진수로 변환하기 위해 무엇을 사용할 수 있습니까? 나는 od가 트릭을 할 것이라고 생각했지만 ASCII 숫자 표현을 제공하고 있다는 것을 깨닫지 못합니다.

printf? 심한! 지금은 사용하고 있지만 다른 것은 무엇입니까?


echo "obase=16; 34" | bc

정수 파일 전체를 한 줄에 하나씩 필터링하려면 :

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

시도 printf(1)했습니까?

printf "%x\n" 34
22

모든 셸에 내장 함수를 사용하는 방법이있을 수 있지만 이식성이 떨어집니다. POSIX sh 사양을 확인하여 이러한 기능이 있는지 확인하지 않았습니다.


16 진수에서 10 진수로 :

$ echo $((0xfee10000))
4276158464

10 진수에서 16 진수로 :

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

시험:

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산술 평가에 대한 문서 페이지 에서 가져온 예 입니다.

나는 Bash가 비슷한 기능을 가지고 있다고 생각합니다.


# 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

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);
    }

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
}

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

참고URL : https://stackoverflow.com/questions/378829/convert-decimal-to-hexadecimal-in-unix-shell-script

반응형