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


110

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

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


8
물어봐야 겠네요. printf에 대한 총체적인 점은 무엇입니까? 많은 일반적인 프로그래밍 언어가 printf와 유사한 형식을 지원하므로 아래의 printf 솔루션이 개발자가 이해하기 가장 쉬운 방법 일 것입니다.
Michael Scheper 2013

4
얘야, 모르겠어-그건 5 년 전이야! 나는 그것이 진정한 껍데기 같은 것이 아니라고 생각했을 것입니다.
skiphoppy

답변:


108
echo "obase=16; 34" | bc

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

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

1
나는 bc (1)과 dc (1)을 모두 보았고 그것을 놓쳤습니다.
Keltia

3
@skiphoppy : 다음과 같이 쓰면 : echo "obase = 16; 12 34 56"| bc 1E240을 얻습니다. 다음과 같이 쓴 것과 같습니다. echo "obase = 16; 123456"| 기원전. 따라서 한 줄에있는 정수의 임의의 수를 처리하는 방법은 각 숫자를 자체 줄에 배치하는 것입니다. tr '' '\ 015'<input | bc (공백을 줄 바꿈으로 매핑).
Jonathan Leffler

1
당신이 'BC',하지만 '의 printf를'이 일어날 경우에 배쉬의 일부 위대한입니다 자체
fuzzyTew

1
@Bill Karwin 또는 zsh 또는 busybox이지만 시도하지 않은 셸이 아닐 수도 있습니다. 나는 일반 쉬 더 이상 설치 유지하지 않지만 분명히 skiphoppy 다른 옵션이 무엇인지를 찾고 있습니다
fuzzyTew

2
스리 - Sarnobat @이 있다 진수로 진수. 나는 당신이 16 진수를 dec로 변환한다는 것을 의미한다고 가정합니다. 이를 위해 ibase=16. 자세한 내용 은 bc매뉴얼 을 읽어보십시오 .
Bill Karwin

186

시도 printf(1)했습니까?

printf "%x\n" 34
22

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


5
printf보다 훨씬 많은 POSIX를 얻지 못합니다. 이것은 "sh"에서도 작동합니다.
Orwellophile

4
printf는 매우 정확하지 않습니다. bc이다. 예를 들어, 238862874857408875879219909679752457540printf를 입력하면 "결과가 너무 큼"이 표시됩니다. BC 주 방법은 표준 INT / 긴 / BIGINT보다 큰 것들에 대한 좋은 작품
앤드류 후원자

3
그리고, 당신은 진수, 사용 대문자하려면 printf "%X"대문자 X에서
andrybak

3
그리고 "0x00"과 같은 출력을 강제하려면 printf "0x % 02X"를 사용할 수 있습니다
gbetous

1
... 그리고 bc모든 곳에서 사용할 수있는 것은 아닙니다 (적어도 임베디드 Linux에서는 아닙니다).
Matthieu

69

16 진수에서 10 진수로 :

$ echo $((0xfee10000))
4276158464

10 진수에서 16 진수로 :

$ printf '%x\n' 26
1a

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

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

1
-v VARbash 확장입니다. man 페이지에 언급되지 않음 , printf인수없이 호출 할 경우에만 공개
Adrian W

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

1
이것은 환경에 많은 도움이되었습니다. 어디 printfhex명령을 사용할 수 없습니다.
benchuk

2
@benchuk 어디에서 printf사용할 수 없습니까?
Matthieu


3

에서 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

제 경우에는 printf 솔루션 사용과 관련된 한 가지 문제를 발견했습니다.

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

가장 쉬운 방법은 더 높은 포스트에서 제안 된 bc 와 함께 솔루션을 사용하는 것입니다 .

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


귀하의 솔루션은 몇 년 전에 작성된 솔루션에 무엇을 추가합니까?
Matthieu

1
@Matthieu Bash printf가 8 진법으로 해석하지 못하는 선행 0이있는 숫자 문제를 언급하고 문제를 피하는 솔루션을 보여줍니다.
mwfearnley

2
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
}

1
# 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

1

이것은 쉘 스크립트는 아니지만 bin / oct / dec / hex 사이에서 숫자를 변환하는 데 사용하는 CLI 도구입니다.

    #!/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);
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.