10 진수에서 16 진수로 BASH 기본 변환


29

Bash에서 십진수 에서 다른 밑으로, 특히 16 진수 밑을 어떻게 변환합니까 ? 다른 길로 가기가 쉬운 것 같습니다.

$ echo $((16#55))
85

웹 검색을 통해 변환을 수행하기 위해 수학 및 문자 조작을 수행하는 스크립트를 찾았으며이를 함수로 사용할 수 있지만 bash에는 이미 기본 변환이 내장되어 있다고 생각했을 것입니다. 그렇습니까?


답변:


35

bash(또는 제공하는 쉘 printf명령을 사용할 수 (주로 껍질에 내장 된 표준 POSIX 명령)) :

printf '%x\n' 85

을 사용 zsh하여 다음을 수행 할 수도 있습니다.

dec=85
hex=$(([##16]dec))

이것은 2에서 36까지의 0-9a-z밑수에 적용됩니다 (숫자로 대소 문자를 구분하지 않음).

을 사용 ksh93하면 다음을 사용할 수 있습니다.

dec=85
base54=$(printf %..54 "$dec")

2에서 64 사이 0-9a-zA-Z@_의 자릿수로 작동합니다.

ksh하고 zsh, 또한있다 :

$ typeset -i34 x=123; echo "$x"
34#3l

ksh88에서 최대 36, zsh 및 pdksh 및 ksh93에서 64까지 제한됩니다.

그것들은 모두 long시스템 의 정수 크기로 제한됩니다 ( int일부 쉘 포함). 더 큰 경우에는 bc또는 을 사용할 수 있습니다 dc.

$ echo 'obase=16; 9999999999999999999999' | bc
21E19E0C9BAB23FFFFF
$ echo '16o 9999999999999999999999 p' | dc
21E19E0C9BAB23FFFFF

POSIX에서 요구되는 2에서 일부 수까지 지원되는 기수 범위는 99 이상이어야합니다. 16보다 큰 기수의 경우 9보다 큰 숫자는 공백으로 구분 된 0으로 채워진 10 진수로 표시됩니다.

$ echo 'obase=30; 123456' | bc
 04 17 05 06

또는와 같았습니다 dc(이전 bc에는 래퍼로 사용되었지만 여전히 일부 시스템에 있음 dc).

$ echo 30o123456p | dc
 04 17 05 06

감사. 정확히 내가 찾던 것. (그리고 당황스럽게도 간단합니다.)
Dave Rove

당신이 지정할 수있는 것처럼 임의의 기초를하고 싶다면 어떻게해야 #합니까?
flarn2006

@ flarn2006. 함께 bash내장 명령을 수행 할 수 있습니다 입력 다른 기지의 경우 8, 10, 16 이외의 기지에있는 기지의 숫자가 아니라 출력, 당신은 같은 다른 쉘 필요할 것 zsh또는 ksh또는 사용 bc/dc.
Stéphane Chazelas

1
@StephaneChazelas 정말? 좀 이상해 그것들이 문법이나 문법으로 프로그래밍하기에는 너무 게으른 것 같습니다. 어떤 기반에서 출력한다는 아이디어가 그들이 입력을 구현했다면 마음을 넘지 못했을 것입니다.
flarn2006

alias hex="printf '%x\n'"
mwfearnley

5

printf를 사용하십시오 :

$ printf "%d %x\n" $((16#55)) $((10#85))
85 55

변수 사용 명령 대체에 값을 지정하려면 다음을 수행하십시오.

$ x=$( printf "%x" 85 ) ; echo $x
55

4
또는 -v내장 printf 옵션을 사용하십시오 :printf -v foo "%d" $((16#BEEF)); echo $foo
glenn jackman

@Glenn 여기서는 비표준 옵션을 사용할 -v필요가 없습니다. 나는 그것을 피할 것이다.
Janis

3
-v포크와 파이프를 피할 것입니다 (bash에서 ksh93이 아니라 printf내장 된 것처럼 포크하지 않습니다 ). 참고 $((16#55))하나의 표준이 아니다.
Stéphane Chazelas

@ StéphaneChazelas, 잠시만 기다려주세요. 당신은 ksh93이 포크하지 않는다고 말하고 x=$(some_builtin)있습니까?
glenn jackman

1
@glennjackman, 예. 외부 명령을 실행하는 데만 포크입니다.
Stéphane Chazelas

2

모든 POSIX 호환 쉘에 내장 된 산술 확장 대체를 사용하십시오. 요즘에는 거의 보편적입니다.

$ echo $((0xbc))
188

$ hex=dead
$ dec=$((0x$hex))
$ echo $dec
57005

주의 : 특히 마지막 예에서 확장은 예기치 않은 결과를 초래할 수 있습니다. 변수 'hex'의 16 진수는 올바른 16 진 상수를 형성해야합니다. 그렇지 않으면 잠재적으로 모호한 오류 메시지가 발생합니다. 예를 들어 '16 진수 '가'0xdead '인 경우 산술 확장은 0x0xdead가되어 상수로 해석 할 수 없습니다. 물론이 경우 산술 확장 $ (($ hex))은 트릭을 수행합니다. 독자가 선택적인 '0x'접두사를 제거하는 간단한 하위 문자열 처리 패턴 일치를 작성하는 연습으로 남아 있습니다.


4
OP가 그의 예에서했던 것과 똑같은 일을하고 있습니다. 그는 동작을 찾고 있습니다.
Thomas Guyot-Sionnest

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.