ASCII에서 바이너리로, 바이너리에서 ASCII로 변환 도구?

ASCII에서 바이너리로, 바이너리에서 ASCII로 변환 도구?

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 codeperlsed
  • 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; }

관련 정보