파이썬에서 문자열의 이진 표현을 얻는 방법이 필요합니다. 예 :
st = "hello world"
toBinary(st)
이를위한 깔끔한 방법의 모듈이 있습니까?
ord
각 문자의 inal 번호 (예 : 16 진수)를 의미합니까?
파이썬에서 문자열의 이진 표현을 얻는 방법이 필요합니다. 예 :
st = "hello world"
toBinary(st)
이를위한 깔끔한 방법의 모듈이 있습니까?
ord
각 문자의 inal 번호 (예 : 16 진수)를 의미합니까?
답변:
이 같은?
>>> 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'
' '.join('{0:08b}'.format(ord(x), 'b') for x in st)
경우 zfill(8)
솔루션 보다 약 35 % 더 빠른 을 사용할 수도 있습니다 (적어도 내 컴퓨터에서는).
β
예를 들어 11001110 10110010
내부적으로 표시되는 것처럼 보이는 1 바이트 이상의 문자를 변환 하는 것은 어떻습니까?
좀 더 파이썬적인 방법으로 먼저 문자열을 바이트 배열로 변환 한 다음 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
.
3.7.4
) : (1) bytearray
인코딩 (단지 문자열이 아님 )을 예상하고 (2) 객체 map(bin, ...)
를 반환 map
합니다. 첫 번째 요점 bob
으로 @Tao가 제안한 것처럼 .encoding ( 'ascii')`를 사용합니다. 두 번째 join
는 @Kasramvd의 다른 예에서와 같이 방법을 사용 하여 원하는 결과를 표시합니다.
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에서 문자열은 유니 코드로 간주되며 bytes
Python 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 문자 집합에없는 문자를 포함하는 텍스트를 처리하는 경우 중요합니다.
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 (이진)로 출력하는 부호 역할을합니다.
이것은 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>
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는 모든 문자를 수동으로 정수로 변환 한 다음 해당 정수를 이진 값으로 변환하는 대신 저수준 함수 호출을 수행하기 때문에 바이트 배열로 변환하는 데 훨씬 효율적입니다.
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))