bash에서 부호 없는 10진수(1<<32 미만)를 4바이트(2진수)로 변환하는 방법은 무엇입니까?

bash에서 부호 없는 10진수(1<<32 미만)를 4바이트(2진수)로 변환하는 방법은 무엇입니까?

예:

$ decimal=$(( RANDOM << 17 | RANDOM << 2 | RANDOM >> 13 ))
$ echo $decimal
$ printf "%08x" $decimal | xxd -r -p >bytes

결과는 bytes파일에 있습니다.

먼저 16진수로 불필요하게 변환하지 않고 단일 명령으로 수행할 수 있습니까?

답변1

printf내장 함수를 사용하여 8진수 코드로 제공된 바이트를 내보낼 수 있습니다 .

x=1193046
printf "$(printf "\\%03o" $((x>>24&255)) $((x>>16&255)) $((x>>8&255)) $((x&255)))"

답변2

당신은 그것을 사용할 수 있습니다 perl:

$ perl -e 'print pack "I>", shift' $(( RANDOM << 17 | RANDOM << 2 | RANDOM >> 13 ))

답변3

dc동일하게 임의의 출력 베이스에서 모든 입력 베이스와 출력을 취할 수 있습니다. dc먼저 값을 전달하여 통신합니다 .(또는 공백으로 구분된 값의 문자열)다음은 값을 처리하는 명령입니다. dc입력과 출력 모두 기본적으로 10진수입니다.

예를 들어 10진수 값을 2진수로 변환합니다.(또는 적어도 기본 2):

printf 2o%dp "'A" | dc
1000001

이는 다음 명령 목록과 동일합니다 dc.

  1. 메인 스택의 맨 위에 2를 추가합니다.

  2. 메인 스택에서 최상위 값을 팝하고 해당 값을 o출력 베이스 로 사용합니다.

  3. 65 추가(A의 ASCII 10진수 값이 내 로케일로 변환됨 printf)메인 스택의 맨 위로

  4. 기본 스택에서 최상위 값을 팝하고 p해당 값을 stdout현재 출력 베이스로 지정된 베이스 에 인쇄합니다.

dc또한 입력 베이스에서 해석된 바이트의 ASCII 값을 인쇄합니다.

printf 8i%oP "'A" | dc
A

...그리고...

printf 2i%sP 1000001 | dc
A

i이 절차 는 입력 베이스가 지정되고 i(이전 o출력 베이스 대신) P최상위 스택 값이 출력에서 ​​ASCII 문자로 해석된다는 점 을 제외하면 이전 절차와 매우 유사합니다 .

bc구문이 더 장황해지는 경향이 있지만 동일한 작업을 많이 수행할 수 있습니다. man dc더 많은 일을 할 man bc. 그러나 비트 이동은 이 두 프로그램의 기능이 아닙니다. 그러나 앞서 살펴본 것처럼 모든 POSIX 셸은 산술 확장을 통해 이를 상당히 쉽게 처리할 수 있습니다.

관련 정보