쉘 스크립트에서 이진수를 16진수 및 10진수로 또는 그 반대로 변환해야 하는 상황이 있습니다. 누군가 나에게 도구를 제안할 수 있나요?
답변1
변환을 만드는 것은 매우 간단합니다~에서순수 bash의 바이너리( echo
및 printf
내장 함수):
이진수를 십진수로
$ echo "$((2#101010101))"
341
2진수에서 16진수로
$ printf '%x\n' "$((2#101010101))"
155
Bash만 사용하여 바이너리를 반환하는 것은 약간 복잡하므로 이 문제를 해결하려면 다른 답변을 확인하는 것이 좋습니다.
답변2
이진 데이터는 기본 2 숫자가 아닌 가능한 모든 바이트 값(0 포함)이 있는 데이터를 의미한다고 가정합니다.
전환하다~에서바이너리, od
(표준), xxd
(와 vim
) 또는 '바이너리 perl
' unpack
가 떠오릅니다.
od -An -vtu1 # for decimal
od -An -vtx1 # for hexadecimal
xxd -p # for hexa
perl -pe 'BEGIN{$\="\n";$/=\30};$_=unpack("H*",$_)' # like xxd -p
# for decimal:
perl -ne 'BEGIN{$\="\n";$/=\30;$,=" "}; print unpack("C*",$_)'
이제 다시 변환하세요.도착하다바이너리, awk
(표준) xxd -r
또는 perl
's pack
:
od -tu1
위에서 십진수 출력 perl
:
LC_ALL=C awk '{for (i = 1; i <= NF; i++) printf "%c", $i}'
perl -ape '$_=pack("C*",@F)'
육각형 perl
이상 에서 xxd -p
:
xxd -r -p
perl -pe 'chomp;$_=pack("H*",$_)'
답변3
이를 달성하기 위해 작업 ibase
및 매개변수 와 함께 bc를 사용할 수 있습니다 .obase
중요한 점은 기본을 올바르게 이해해야 한다는 것입니다. 따라서 ibase가 2인 경우 obase를 10으로 설정하면 바이너리의 10이 2이므로 아무 작업도 수행되지 않습니다. 따라서 16진수 표기법을 사용해야 합니다.
따라서 이진수를 십진수로 변환하는 것은 (obase는 A입니다)
2진수에서 10진수로:
$> echo 'ibase=2;obase=A;11110001011010'|bc
15450
2진수에서 16진수로:
$> echo 'ibase=2;obase=10000;11110001011010'|bc
3C5A
obase
"출력 베이스"를 먼저 변경하면 더 쉬워집니다.
$> echo 'obase=10;ibase=2;11110001011010'|bc
15450
$> echo 'obase=16;ibase=2;11110001011010'|bc
3C5A
답변4
바이너리에서 16진수로 사용하는 경우:xxdLinux의 도구, 이진수에서 십진수까지의 경우 qalculate 도구를 사용할 수 있습니다.
xxd --help
xxd 유형 또는 Linux에 대한 도움말입니다 man xxd
.