ASCII를 바이너리로, 바이너리를 ASCII로 변환할 수 있는 도구는 무엇입니까?
나는 다음과 같은 것을 원합니다 :
$ echo --binary "This is a binary message"
01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101
또는 보다 현실적으로는 다음과 같습니다.
$ echo "This is a binary message" | ascii2bin
01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101
반대 상황도 있습니다.
$ echo "01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101" | bin2ascii
This is a binary message
PS: 저는 bash를 사용하고 있습니다
PS2: 잘못된 바이너리를 얻지 않기를 바랍니다.
답변1
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
-e expression
주어진 표현식을perl
코드 로 평가합니다.-p
:sed
모델. 이것표현하다입력의 각 줄이 평가되고, 줄의 내용이 변수에 저장되고$_
평가 후에 인쇄됩니다.표현하다.-l
: 또는 심지어sed
: 전체 줄 대신에콘텐츠(즉, 줄 구분 기호가 없음)$_
(그리고 개행 문자가 출력에 다시 추가됩니다) 따라서 코드 대신 코드라는 점을 제외하면perl -lpe code
동일하게 작동합니다 .sed code
perl
sed
unpack "B*"
기본적으로$_
변수는 처리되고 해당 내용은 첫 번째 바이트의 가장 높은 비트부터 마지막 바이트의 가장 낮은 비트까지 비트 문자열로 추출됩니다.pack
그 반대로 하세요unpack
.perldoc -f pack
자세히보다.
공백 포함:
$ echo AB | perl -lpe '$_=join " ", unpack"(B8)*"'
01000001 01000010
$ echo 01000001 01000010 | perl -lape '$_=pack"(B8)*",@F'
AB
(입력이 8비트 블록(0 패딩)이라고 가정합니다.)
를 사용하여 unpack "(B8)*"
한 번에 8비트를 추출하고 결과 문자열을 공백으로 연결합니다 join " "
.
답변2
xxd
변환에는 ASCII와 바이너리를 사용할 수 있습니다 .
$ echo -n "A" | xxd -b
0000000: 01000001 A
$ echo -n "A" | xxd -b | awk '{print $2}'
01000001
스위치 베이스
16진수, 8진수, 10진수 간의 기본적인 변환만 수행하려면 일반적으로 기본 계산기 명령줄 도구( bc
)를 사용합니다. bc
염기의 올바른 순서는 항상 까다롭다는 점에 유의하세요 . obase
먼저 결과 염기( )를 지정해야 합니다.그 다음에선택사항을 추가하세요 ibase
.
$ echo "obase=2; ibase=16; A" | bc
1010
$ echo "obase=16; ibase=2; 1010" | bc
A
답변3
bc 및 bash 사용:
#!/bin/bash
chrbin() {
echo $(printf \\$(echo "ibase=2; obase=8; $1" | bc))
}
ordbin() {
a=$(printf '%d' "'$1")
b=$(echo "obase=2; $a" | bc)
printf '%08d' $b
}
ascii2bin() {
echo -n $* | while IFS= read -r -n1 char
do
ordbin $char | tr -d '\n'
echo -n " "
done
}
bin2ascii() {
for bin in $*
do
chrbin $bin | tr -d '\n'
done
}
ascii2bin "This is a binary message"
bin2ascii 01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101
답변4
바이너리를 ASCII로 변환하기 위한 쉘 솔루션:
bin2ascii() { { tr -cd 01 | fold -w8; echo; } | sed '1i obase=8; ibase=2' | bc | sed 's/^/\\/' | tr -d '\n' | xargs -0 echo -e; }