programing

문자열을 이진으로 변환하는 방법은 무엇입니까?

magicmemo 2023. 5. 11. 21:21
반응형

문자열을 이진으로 변환하는 방법은 무엇입니까?

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

st = "hello world"
toBinary(st)

이것을 하는 깔끔한 방법의 모듈이 있습니까?

이런 거?

>>> 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'

이진법이 의미하는 경우bytestype. 전달된 인코딩 유형을 사용하여 문자열을 바이트 개체로 인코딩하는 문자열 개체의 메서드를 사용할 수 있습니다.올바른 인코딩을 전달해야 합니다.encode기능.

In [9]: "hello world".encode('ascii')                                                                                                                                                                       
Out[9]: b'hello world'

In [10]: byte_obj = "hello world".encode('ascii')                                                                                                                                                           

In [11]: byte_obj                                                                                                                                                                                           
Out[11]: b'hello world'

In [12]: byte_obj[0]                                                                                                                                                                                        
Out[12]: 104

그렇지 않으면, 만약 당신이 그것들이 0과 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'

사용할 수도 있습니다.binasciipython 2의 모듈:

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

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

암호화만 하면 됩니다.

'string'.encode('ascii')

다음을 사용하여 문자열의 문자에 대한 코드 값에 액세스할 수 있습니다.ord()내장 기능만약 당신이 이것을 이진법으로 포맷해야 한다면,string.format()방법이 그 일을 할 것입니다.

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

(그 코드 스니펫을 게시해 준 Ashwini Chaudhary에게 감사합니다.)

위의 코드는 Python 3에서 작동하지만 UTF-8 이외의 인코딩을 가정할 경우 이 문제는 더 복잡해집니다. Python 2에서 문자열은 바이트 시퀀스이며 기본적으로 ASCII 인코딩을 가정합니다.파이썬 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 문자 집합에 없는 문자를 포함하는 텍스트를 처리하는 경우에는 중요합니다.

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
  • 콜론의 왼쪽 또는 (i)는 값이 형식화되어 출력에 삽입될 실제 객체입니다.or()를 사용하면 단일 문자열에 대한 기본 10 코드 포인트를 얻을 수 있습니다.

  • 콜론의 오른쪽은 형식 지정자입니다. 08은 폭 8, 0 패딩을 의미하며 b는 base 2(2진수)에서 결과 숫자를 출력하는 기호로 기능합니다.

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는 모든 문자를 수동으로 정수로 변환한 다음 해당 정수를 이진 값으로 변환하는 대신 하위 수준의 함수 호출을 수행하므로 바이트 배열로 변환하는 데 훨씬 더 효율적입니다.

다음은 사용된 기존 답변에 대한 업데이트이며 더 이상 그런 방식으로 작동할 수 없습니다.

>>> 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>
''.join(format(i, 'b') for i in bytearray(str, encoding='utf-8'))

이제 0이 8비트에 도달하여 바이트를 형성하기 위해 추가되는 0이 없으므로 문자열로 되돌리기가 쉬우므로 추가된 0을 제거하는 복잡성을 피하기 위해 문자열로 되돌리기가 쉽습니다.

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))

언급URL : https://stackoverflow.com/questions/18815820/how-to-convert-string-to-binary

반응형