[python] 바이너리를 ASCII로 또는 그 반대로 변환

이 코드를 사용하여 문자열을 가져 와서 바이너리로 변환합니다.

bin(reduce(lambda x, y: 256*x+y, (ord(c) for c in 'hello'), 0))

이 출력 :

0b110100001100101011011000110110001101111

이 사이트 (오른쪽 사이트)에 넣으면 내 메시지가 hello돌아옵니다. 어떤 방법을 사용하는지 궁금합니다. 바이너리 문자열을 8로 분리 한 다음 해당 값 bin(ord(character))또는 다른 방식으로 일치시킬 수 있다는 것을 알고 있습니다. 정말 더 간단한 것을 찾고 있습니다.



답변

[ -~]Python 2 의 범위 에 있는 ASCII 문자의 경우 :

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

반대로:

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

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

Python 3에서 모든 유니 코드 문자를 지원하려면 :

def text_to_bits(text, encoding='utf-8', errors='surrogatepass'):
    bits = bin(int.from_bytes(text.encode(encoding, errors), 'big'))[2:]
    return bits.zfill(8 * ((len(bits) + 7) // 8))

def text_from_bits(bits, encoding='utf-8', errors='surrogatepass'):
    n = int(bits, 2)
    return n.to_bytes((n.bit_length() + 7) // 8, 'big').decode(encoding, errors) or '\0'

다음은 단일 소스 Python 2/3 호환 버전입니다.

import binascii

def text_to_bits(text, encoding='utf-8', errors='surrogatepass'):
    bits = bin(int(binascii.hexlify(text.encode(encoding, errors)), 16))[2:]
    return bits.zfill(8 * ((len(bits) + 7) // 8))

def text_from_bits(bits, encoding='utf-8', errors='surrogatepass'):
    n = int(bits, 2)
    return int2bytes(n).decode(encoding, errors)

def int2bytes(i):
    hex_string = '%x' % i
    n = len(hex_string)
    return binascii.unhexlify(hex_string.zfill(n + (n & 1)))

>>> text_to_bits('hello')
'0110100001100101011011000110110001101111'
>>> text_from_bits('110100001100101011011000110110001101111') == u'hello'
True


답변

내장 전용python

다음은 단순한 문자열에 대한 순수한 파이썬 메서드입니다.

def string2bits(s=''):
    return [bin(ord(x))[2:].zfill(8) for x in s]

def bits2string(b=None):
    return ''.join([chr(int(x, 2)) for x in b])

s = 'Hello, World!'
b = string2bits(s)
s2 = bits2string(b)

print 'String:'
print s

print '\nList of Bits:'
for x in b:
    print x

print '\nString:'
print s2

String:
Hello, World!

List of Bits:
01001000
01100101
01101100
01101100
01101111
00101100
00100000
01010111
01101111
01110010
01101100
01100100
00100001

String:
Hello, World!


답변

문자 별 작업 외에 어떻게 할 수 있다고 생각하는지 잘 모르겠습니다. 본질적으로 문자 별 작업입니다. 이 작업을 수행 할 수있는 코드가 분명히 있지만 문자 단위로 수행하는 것보다 “간단한”방법은 없습니다.

먼저 0b접두사 를 제거하고 문자열을 왼쪽 0으로 채워 길이가 8로 나뉘어 비트 문자열을 문자로 쉽게 나눌 수 있습니다.

bitstring = bitstring[2:]
bitstring = -len(bitstring) % 8 * '0' + bitstring

그런 다음 문자열을 8 개의 이진수 블록으로 나누고 ASCII 문자로 변환 한 다음 다시 문자열로 결합합니다.

string_blocks = (bitstring[i:i+8] for i in range(0, len(bitstring), 8))
string = ''.join(chr(int(char, 2)) for char in string_blocks)

실제로 숫자로 처리하고 싶다면 오른쪽에서 왼쪽 대신 왼쪽에서 오른쪽으로 이동하려면 맨 왼쪽 문자의 길이가 최대 7 자리라는 사실을 고려해야합니다.


답변

이것이 당신의 작업을 해결하는 방법입니다.

str = "0b110100001100101011011000110110001101111"
str = "0" + str[2:]
message = ""
while str != "":
    i = chr(int(str[:8], 2))
    message = message + i
    str = str[8:]
print message


답변

파일을 가져 오지 않으려면 다음을 사용할 수 있습니다.

with open("Test1.txt", "r") as File1:
St = (' '.join(format(ord(x), 'b') for x in File1.read()))
StrList = St.split(" ")

텍스트 파일을 바이너리로 변환합니다.

이것을 사용하여 다시 문자열로 변환 할 수 있습니다.

StrOrgList = StrOrgMsg.split(" ")


for StrValue in StrOrgList:
    if(StrValue != ""):
        StrMsg += chr(int(str(StrValue),2))
print(StrMsg)

도움이 되었기를 바라며 TCP를 통해 전송하기 위해 일부 사용자 지정 암호화와 함께 사용했습니다.


답변

이를 수행 할 코드를 찾고 있거나 알고리즘을 이해하고 있습니까?

이것이 당신이 필요로하는 것을합니까 ? 구체적으로 a2b_uu그리고 b2a_uu? 원하는 것이 아닌 경우 다른 옵션이 많이 있습니다.

(참고 : Python 사람은 아니지만 이것은 명백한 대답처럼 보였습니다)


답변

바이너리를 동등한 문자로 변환합니다.

k=7
dec=0
new=[]
item=[x for x in input("Enter 8bit binary number with , seprator").split(",")]
for i in item:
    for j in i:
        if(j=="1"):
            dec=2**k+dec
            k=k-1
        else:
            k=k-1
    new.append(dec)
    dec=0
    k=7
print(new)
for i in new:
    print(chr(i),end="")