이 코드를 사용하여 문자열을 가져 와서 바이너리로 변환합니다.
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="")