it-swarm.it

Converti binario in ASCII e viceversa

Usando questo codice per prendere una stringa e convertirla in binario:

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

questo produce:

0b110100001100101011011000110110001101111

Che, se lo inserisco in questo sito (sul sito di destra) ricevo il mio messaggio di hello indietro. Mi chiedo quale metodo usi. So che potrei dividere la stringa di binario in 8 e quindi abbinarla al valore corrispondente a bin(ord(character)) o in qualche altro modo. Davvero alla ricerca di qualcosa di più semplice.

69
sbrichards

Per ASCII caratteri nell'intervallo [ -~] on Python 2:

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

In retromarcia:

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

In Python 3.2+:

>>> bin(int.from_bytes('hello'.encode(), 'big'))
'0b110100001100101011011000110110001101111'

In retromarcia:

>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> n.to_bytes((n.bit_length() + 7) // 8, 'big').decode()
'hello'

Per supportare tutti i caratteri Unicode in 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'

Ecco single-source Python 2/3 versione compatibile:

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

Esempio

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

Incorporato solo python

Ecco un puro python per stringhe semplici, lasciato qui per i posteri.

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!
14
tmthydvnprt

Non sono sicuro di come pensi di poterlo fare diversamente dal personaggio per personaggio - è intrinsecamente un'operazione personaggio per personaggio. Esiste sicuramente un codice là fuori per farlo per te, ma non esiste un modo "più semplice" che farlo carattere per carattere.

Innanzitutto, è necessario rimuovere 0b prefisso e left-zero-pad della stringa in modo che la sua lunghezza sia divisibile per 8, per facilitare la divisione della stringa di bit in caratteri:

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

Quindi dividi la stringa in blocchi di otto cifre binarie, convertili in ASCII e ricollegali in una stringa:

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)

Se in realtà vuoi trattarlo come un numero, devi comunque tenere conto del fatto che il carattere più a sinistra sarà lungo al massimo sette cifre se vuoi andare da sinistra a destra invece che da destra a sinistra.

9
agf

se non vuoi importare alcun file puoi usare questo:

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

per convertire un file di testo in binario.

e puoi usarlo per riconvertirlo in stringa:

StrOrgList = StrOrgMsg.split(" ")


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

spero che sia utile, l'ho usato con un po 'di crittografia personalizzata per inviare su TCP.

2
Kyle Burns

Questo è il mio modo di risolvere il tuo compito:

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

Stai cercando il codice per farlo o capire l'algoritmo?

Fa questo quello che ti serve ? In particolare a2b_uu e b2a_uu? Ci sono MOLTE altre opzioni nel caso in cui quelle non siano quelle che desideri.

(NOTA: non un Python ragazzo ma questa sembrava una risposta ovvia)

1
Jaxidian