파이썬에서 문자열을 바이너리로 변환


106

파이썬에서 문자열의 이진 표현을 얻는 방법이 필요합니다. 예 :

st = "hello world"
toBinary(st)

이를위한 깔끔한 방법의 모듈이 있습니까?


8
구체적으로 어떤 결과를 기대합니까?
NPE 2013 년

"이진"이란 0101010 유형 또는 ord각 문자의 inal 번호 (예 : 16 진수)를 의미합니까?
cdarke 2013 년

실제로 이진 (0과 1)을 의미한다고 가정하면 각 문자 (문자 당 8 비트)의 이진 표현을 차례로 원합니까? 예를 들어 h는 ascii 값 104는 바이너리에서 01101000입니다
ChrisProsser 2013 년


답변:


124

이 같은?

>>> st = "hello world"
>>> ' '.join(format(ord(x), 'b') for x in st)
'1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100'

#using `bytearray`
>>> ' '.join(format(x, 'b') for x in bytearray(st, 'utf-8'))
'1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100'

21
또는 각 이진수가 1 바이트가되도록하려면 : ''.join (format (ord (i), 'b'). zfill (8) for i in st)
ChrisProsser

5
전체 바이트의 ' '.join('{0:08b}'.format(ord(x), 'b') for x in st)경우 zfill(8)솔루션 보다 약 35 % 더 빠른 을 사용할 수도 있습니다 (적어도 내 컴퓨터에서는).
최대

β예를 들어 11001110 10110010내부적으로 표시되는 것처럼 보이는 1 바이트 이상의 문자를 변환 하는 것은 어떻습니까?
Sergey Bushmanov

1
오래 전에 게시 된 것을 알고 있지만 ASCII가 아닌 문자는 어떻습니까?
pkqxdd

48

좀 더 파이썬적인 방법으로 먼저 문자열을 바이트 배열로 변환 한 다음 bin내에서 함수 를 사용할 수 있습니다 map.

>>> st = "hello world"
>>> map(bin,bytearray(st))
['0b1101000', '0b1100101', '0b1101100', '0b1101100', '0b1101111', '0b100000', '0b1110111', '0b1101111', '0b1110010', '0b1101100', '0b1100100']

또는 가입 할 수 있습니다.

>>> ' '.join(map(bin,bytearray(st)))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'

에 있습니다 python3 당신에 대한 인코딩 지정해야합니다 bytearray기능 :

>>> ' '.join(map(bin,bytearray(st,'utf8')))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'

binascii파이썬 2에서 모듈을 사용할 수도 있습니다 .

>>> import binascii
>>> bin(int(binascii.hexlify(st),16))
'0b110100001100101011011000110110001101111001000000111011101101111011100100110110001100100'

hexlify이진 데이터의 16 진수 표현을 반환 한 다음 16을 기본으로 지정하여 int로 변환 한 다음 bin.


5
이것은 더 비단뱀적일뿐만 아니라 다중 바이트 비 ASCII 문자열에 대해 "더"정확합니다.
Sergey Bushmanov

참고로 (적어도 현재 버전의 경우 3.7.4) : (1) bytearray인코딩 (단지 문자열이 아님 )을 예상하고 (2) 객체 map(bin, ...)를 반환 map합니다. 첫 번째 요점 bob으로 @Tao가 제안한 것처럼 .encoding ( 'ascii')`를 사용합니다. 두 번째 join는 @Kasramvd의 다른 예에서와 같이 방법을 사용 하여 원하는 결과를 표시합니다.
Antoine

35

인코딩 만하면됩니다.

'string'.encode('ascii')

나를 위해 ( v3.7.4), 이것은 bytes객체 (사용 가능한 경우 각 바이트의 ascii 표현 포함)를 반환하며 , 이진 표현을 표시하려면 bin, 예를 들어 ' '.join(item[2:] for item in map(bin, 'bob'.encode('ascii')))( 0b이진 표현의 시작 부분에서 제거해야 함 각 캐릭터의).
Antoine

15

ord()내장 함수를 사용하여 문자열의 문자에 대한 코드 값에 액세스 할 수 있습니다 . 그런 다음이를 바이너리로 포맷해야하는 경우 string.format()메서드가 작업을 수행합니다.

a = "test"
print(' '.join(format(ord(x), 'b') for x in a))

(코드 스 니펫을 게시 한 Ashwini Chaudhary에게 감사드립니다.)

위의 코드는 Python 3에서 작동하지만 UTF-8 이외의 인코딩을 가정하면이 문제가 더 복잡해집니다. Python 2에서 문자열은 바이트 시퀀스이며 기본적으로 ASCII 인코딩이 사용됩니다. Python 3에서 문자열은 유니 코드로 간주되며 bytesPython 2 문자열처럼 작동 하는 별도의 유형이 있습니다. UTF-8 이외의 인코딩을 가정하려면 인코딩을 지정해야합니다.

Python 3에서는 다음과 같이 할 수 있습니다.

a = "test"
a_bytes = bytes(a, "ascii")
print(' '.join(["{0:b}".format(x) for x in a_bytes]))

UTF-8과 ascii 인코딩의 차이점은 단순한 영숫자 문자열에서는 분명하지 않지만 ascii 문자 집합에없는 문자를 포함하는 텍스트를 처리하는 경우 중요합니다.


2

Python 버전 3.6 이상에서는 f-string 을 사용 하여 결과 형식을 지정할 수 있습니다.

str = "hello world"
print(" ".join(f"{ord(i):08b}" for i in str))

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
  • 콜론의 왼쪽 ord (i)는 값이 형식화되고 출력에 삽입 될 실제 객체입니다. ord ()를 사용하면 단일 str 문자에 대한 기본 10 코드 포인트가 제공됩니다.

  • 콜론의 오른쪽은 형식 지정자입니다. 08은 너비 8, 0 패딩을 의미하며 b는 결과 숫자를 밑이 2 (이진)로 출력하는 부호 역할을합니다.


1

이것은 bytearray()더 이상 그렇게 작동하지 않는 기존 답변에 대한 업데이트입니다 .

>>> st = "hello world"
>>> map(bin, bytearray(st))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string argument without an encoding

위 링크에서 설명한 것처럼 소스가 문자열 인 경우 인코딩도 제공해야하기 때문입니다 .

>>> map(bin, bytearray(st, encoding='utf-8'))
<map object at 0x7f14dfb1ff28>

0
def method_a(sample_string):
    binary = ' '.join(format(ord(x), 'b') for x in sample_string)

def method_b(sample_string):
    binary = ' '.join(map(bin,bytearray(sample_string,encoding='utf-8')))


if __name__ == '__main__':

    from timeit import timeit

    sample_string = 'Convert this ascii strong to binary.'

    print(
        timeit(f'method_a("{sample_string}")',setup='from __main__ import method_a'),
        timeit(f'method_b("{sample_string}")',setup='from __main__ import method_b')
    )

# 9.564299999998184 2.943955828988692

method_b는 모든 문자를 수동으로 정수로 변환 한 다음 해당 정수를 이진 값으로 변환하는 대신 저수준 함수 호출을 수행하기 때문에 바이트 배열로 변환하는 데 훨씬 효율적입니다.


-1
a = list(input("Enter a string\t: "))
def fun(a):
    c =' '.join(['0'*(8-len(bin(ord(i))[2:]))+(bin(ord(i))[2:]) for i in a])
    return c
print(fun(a))

1
이 읽을 수없는 코드 전용 답변을 설명과 함께 보완하고 싶습니까? 이는 StackOverflow가 무료 코드 작성 서비스라는 오해와 싸우는 데 도움이 될 것입니다. 경우 당신은 정보가 여기에 제공하려고 가독성을 향상시키고 자 : stackoverflow.com/editing-help
Yunnosch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.