[unix] 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

추신 : 나는 bash를 사용하고있다.

PS2 : 잘못된 바이너리를 얻지 않기를 바랍니다.



답변

$ 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 " ".


답변

xxdASCII 및 이진을 변환 하는 데 사용할 수 있습니다 .

$ echo -n "A" | xxd -b
0000000: 01000001                                               A

$ echo -n "A" | xxd -b | awk '{print $2}'
01000001

베이스 변환

16 진수, 8 진수 및 12 월 사이에 기본 변환을 수행하려는 경우 일반적으로 기본 계산기 명령 줄 도구 ( bc)를 사용하여 이러한 작업을 수행합니다. bc항상 올바른 염기 순서에 대해 매우 까다 롭다는 점 에 유의 하십시오. 먼저 결과 염기 ( obase) 를 지정한 다음을 선택해야합니다 ibase.

$ echo "obase=2; ibase=16; A" | bc
1010

$ echo "obase=16; ibase=2; 1010" | bc
A


답변

bc 및 bash 사용 :

#!/bin/bash

chrbin() {
        echo $(printf \\$(echo "ibase=2; obase=8; $1" | bc))
}

ordbin() {
  a=$(printf '%d' "'$1")
  echo "obase=2; $a" | bc
}

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


답변

바이너리를 ASCII로 변환하는 셸 솔루션 :

bin2ascii() { { tr -cd 01 | fold -w8; echo; } | sed '1i obase=8; ibase=2' | bc | sed 's/^/\\/' | tr -d '\n' | xargs -0 echo -e; }


답변

파이썬에서

[ -~]Python 2 범위의 ASCII 문자 :

>>> import binascii
>>> bin(int(binascii.hexlify('hello'), 16))
'0b110100001100101011011000110110001101111'

반대로:

>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> binascii.unhexlify('%x' % n)
'hello'

파이썬 3.2 이상에서 :

>>> bin(int.from_bytes('hello'.encode(), 'big'))
'0b110100001100101011011000110110001101111'

반대로:

>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> n.to_bytes((n.bit_length() + 7) // 8, 'big').decode()
'hello'

답변

파이썬 3 사용하기 :

#!/usr/bin/env python3

import sys


if __name__ == "__main__":
    if len(sys.argv) != 1 and len(sys.argv) <= 3:
        if sys.argv[1] in ('-b', '--binary'):
            n = int(sys.argv[2].replace(' ', ''), 2)
            print(n.to_bytes((n.bit_length() + 7) // 8, 'big').decode())
        if sys.argv[1] in ('-a', '--ascii'):
            print((bin(int.from_bytes(sys.argv[2].encode(), 'big')))[2:])
    else:
        print("Example: decode -b '10000001'")

예를 들어 “bin2ascii”로 저장되었습니다.

$ bin2ascii -a "Hello, world!"
1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001

$ bin2ascii -b 1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001
Hello, world!


답변

base64로 이진 인코딩

$ echo "This is a binary message" | base64
VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==

base64 디코딩

$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message