예:
$ 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
.
메인 스택의 맨 위에 2를 추가합니다.
메인 스택에서 최상위 값을 팝하고 해당 값을
o
출력 베이스 로 사용합니다.65 추가(A의 ASCII 10진수 값이 내 로케일로 변환됨
printf
)메인 스택의 맨 위로기본 스택에서 최상위 값을 팝하고
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 셸은 산술 확장을 통해 이를 상당히 쉽게 처리할 수 있습니다.