나는 그것을 확인하고 싶다Base64정수 값. Linux 명령이 있지만 base64
이를 정수에 적용하는 방법을 이해할 수 없습니다.
시도했지만 base64 10
오류 메시지가 나타납니다.base64: 10: No such file or directory
문제는 Base64가 바이너리를 텍스트로 변환하는 데 사용되므로 텍스트 매개변수를 전달할 필요가 없다는 점일 수 있다고 생각합니다. 따라서 내 인수는 10
이진수 대신 텍스트 문자열로 읽혀집니다. 텍스트 매개변수를 바이너리로 변환하는 방법이 있나요?
base64 명령을 사용하여 정수의 Base64 값을 얻는 방법은 무엇입니까?
답변1
숫자를 16진수로 변환한 다음 echo
해당 바이트 시퀀스를 인쇄하고 파이프하는 데 사용 base64
됩니다. 따라서 base64를 사용하여 정수 10을 인코딩하려면 다음을 사용합니다.
echo -en '\xA' | base64
결과를 설명해보자. 바이트 10에는 다음과 같은 이진 표현이 있습니다.
00001010
Base64가 하는 일은 이 데이터를 6비트 그룹으로 나누는 것입니다. 따라서 패딩을 사용하면 다음 두 개의 6let을 얻을 수 있습니다.
000010 100000
십진수 표현은 각각 문자 C와 g에 해당하는 2와 32입니다.
답변2
아래 명령은 10진수를 64진수로 변환합니다. Base64 인코딩 체계를 사용하지 않지만 문자를 숫자로 사용하는 Base64 인코딩 체계의 URL 안전 변형을 사용합니다.
awk 'NR==FNR{a[NR-1]=$0;next}{if($0==0){print"A";next}o="";for(n=$0;n!=0;n=int(n/64))o=a[n%64]o;print o}' <(printf %s\\n {A..Z} {a..z} {0..9} - _) -
다음 명령은 Bash에서 동일한 작업을 수행합니다. .Zsh 로 바꾸면 l%64
Zsh에서도 작동합니다 l%64+1
.
unset a;a=({A..Z} {a..z} {0..9} - _);while IFS= read l;do if ((l==0));then echo A;continue;fi;o=;for ((;l!=0;l/=64));do o=${a[l%64]}$o;done;printf %s\\n "$o";done
이는 64진수를 10진수로 변환합니다.
awk 'NR==FNR{a[$0]=NR-1;next}{o=0;for(i=NF;i>=1;i--)o+=a[$i]*64^(NF-i);print o}' FS= <(printf %s\\n {A..Z} {a..z} {0..9} - _) -
이는 Bash에서도 동일한 작업을 수행합니다.
unset a;i=0;declare -A a;for x in {A..Z} {a..z} {0..9} - _;do a[$x]=$((i++));done;while IFS= read l;do o=0;for((i=${#l};i>=1;i--));do let o+=${a[${l:i-1:1}]}*64**(${#l}-i);done;echo "$o";done
이러한 awk
명령을 사용하면 2**53+1
숫자가 더 많이 손실되고 정밀도가 크게 손실되지만 이를 방지하려면 4.1 이상에서 -M
( )를 추가할 수 있습니다.--bignum
gawk
Bash 명령은 정수 오버플로 2**63
와 더 큰 숫자를 발생시킵니다.