ASCII에서 이진으로, 이진에서 ASCII 로의 변환 도구?


31

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 : 잘못된 바이너리를 얻지 않기를 바랍니다.


당신이 궁극적으로 이것으로하고 싶은 것을 게시 할 수 있습니까? 우리가 제공하는 솔루션은 모두 좁은 유스 케이스에서만 작동 할 것입니다. 더 복잡한 방식으로 사용하고 싶은 것을 요구할 것입니다. 제공 된 솔루션은 실패 할 것입니다. 그 시나리오에서.
slm

@ slm 완료, 나는 질문을 편집
RSFalcon7

의 LF 문자 출력을 무시하고 싶습니다 echo.
Stéphane Chazelas

이것을 이해하는 가장 좋은 방법은 모든 것이 이진이라는 것입니다. 당신이하려는 것은 원래 ASCII 코딩 된 메시지의 이진을 나타내는 이진수의 ASCII 문자열을 생성하는 것입니다. 따라서 원본을 ASCII로 코딩하는 것은 무의미합니다 (거의 거의 그대로). 이제 바이너리를 텍스트로 인쇄 할 수있는 도구가 필요합니다. (방법을 알려주는 답변이 이미 있습니다).
ctrl-alt-delor

답변:


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


많은 감사합니다. 나는 펄에 어느 정도 익숙하지만 확장 된 세부 사항은 펄에 완전히 익숙한 사람들에게 매우 도움이 될 것이다.
Yokai

23

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

xxd첫 번째 성가신 열과 줄 끝의 기본 입력을 보여주는 것을 제외하고는 좋을 것입니다.
RSFalcon7

@ RSFalcon7-알다시피 파이프를 awk제거 하여 파이프를 제거 할 수는 있지만이 디스플레이를 비활성화하는 스위치가없는 것 같습니다. | awk '{print $2}'. 다른 도구들도 있습니다. od& hexdump. 그것들을 사용하는 다른 방법을 찾고 있습니다.
slm

1
@ RSFalcon7 -p은 '순수한'출력을 얻기 위해이 옵션을 사용합니다
Pureferret

나는 xxd -b접근 방식을 직접 사용 하지만 xxd바이너리를 ASCII로 다시 변환 하는 데 단독으로는 사용할 수 없습니다 . 그렇게 printf 'obase=16;ibase=2;%s\n' "$n" | bc | xxd -p -r하려면, 긴 숫자 문자열 또는 세미콜론으로 구분 된 숫자 문자열로 변환 할 숫자가 포함 된 $ n과 같은 것을 사용해야한다고 두려워합니다 . $ n이 쉘의 산술 유형에 적합하다는 것을 보장 할 수 있다면 다음과 같이 벗어날 수 있습니다.printf '%x\n' $((2#$n)) | xxd -p -r
Franki

펄 / 파이썬과 같은 것을 사용할 수 없다면
Franki

8

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

5

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

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

2
이것은 순수한 쉘 솔루션이 아닙니다. sed, trbc쉘 스크립트에서 호출되는 외부 프로그램입니다.
Yokai

4

파이썬에서

[ -~]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'

2

파이썬 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!

0

base64로 이진 인코딩

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

base64 디코딩

$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.