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

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

Bash에서 진수를 십진수로 변환하는 방법도착하다또 다른 기본, 특히 16진수입니다. 다른 방향으로 가는 것이 쉬운 것 같습니다.

$ echo $((16#55))
85

웹을 검색하면서 수학 및 문자 조작을 수행하여 함수로 사용할 수 있는 변환을 수행하는 스크립트를 찾았지만 bash에는 이미 기수 변환이 내장되어 있는 것 같습니다. 이것이 가능합니까?

답변1

bash(또는 해당 printf명령을 사용할 수 있는 경우 임의의 쉘(일반적으로 쉘에 내장된 표준 POSIX 명령))을 사용하십시오 .

printf '%x\n' 85

를 사용하면 zsh다음 작업도 수행할 수 있습니다.

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

이는 2에서 36까지의 기본 숫자에 적용됩니다( 0-9a-z숫자는 대소문자를 구분하지 않습니다).

$(([#16]dev))옵션이 활성화되면 (하나만 ) 또는 (기본 16의 특별한 경우로) #로 확장됩니다 ( 기본 8에도 적용됩니다( 옵션도 활성화된 경우 대신 )).16#550x55cbases01258#125octalzeroes

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

dec=85
base54=${ printf %..54 "$dec"; }

2~64진수에 적용됩니다( 0-9a-zA-Z@_숫자와 동일).

ksh에는 zsh다음도 있습니다.

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

ksh88, zsh 및 pdksh에는 최대 36개 베이스가 있는 반면, ksh93에는 최대 64개 베이스가 있습니다.

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

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

지원되는 기본 범위는 2개부터 POSIX에서 요구하는 최소 99개까지입니다. 16보다 큰 진수의 경우 9보다 큰 숫자는 공백으로 구분된 0으로 채워진 십진수로 표시됩니다.

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

dc또는 ( bc일부 시스템에서는 여전히 래퍼인 ) 과 동일합니다 dc.

$ echo 30o123456p | dc
 04 17 05 06

답변2

printf를 사용하세요:

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

변수에 값을 할당하려면 명령 대체를 사용하십시오.

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

답변3

모든 POSIX 호환 셸에 있는 내장 산술 확장을 사용하여 교체하세요. 이는 요즘 거의 보편적입니다.

$ echo $((0xbc))
188

그리고

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

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

답변4

awk를 사용할 수 있습니다.벨벳 도서관:

$ velour -n 'print n_baseconv(15, 10, 16)'
F

또는:

$ velour -n 'print n_baseconv(ARGV[1], 10, 16)' 15
F

관련 정보