it-swarm.com.de

Konvertieren Sie den String in Python in eine Binärdatei

Ich brauche einen Weg, um die binäre Darstellung einer Zeichenfolge in Python zu erhalten. z.B. 

st = "hello world"
toBinary(st)

Gibt es ein ordentliches Modul dafür?

68
user1090614

Etwas wie das?

>>> 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))
'1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100'
85

Als Pythonic-Methode können Sie zunächst Ihren String in ein Byte-Array konvertieren und dann die bin-Funktion in map verwenden:

>>> st = "hello world"
>>> map(bin,bytearray(st))
['0b1101000', '0b1100101', '0b1101100', '0b1101100', '0b1101111', '0b100000', '0b1110111', '0b1101111', '0b1110010', '0b1101100', '0b1100100']

Oder du kannst mitmachen:

>>> ' '.join(map(bin,bytearray(st)))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'

Beachten Sie, dass Sie in python3 eine Kodierung für die bytearray-Funktion angeben müssen:

>>> ' '.join(map(bin,bytearray(st,'utf8')))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'

Sie können binascii module auch in Python 2 verwenden:

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

hexlify gibt die hexadezimale Darstellung der Binärdaten zurück. Sie können dann in int konvertieren, indem Sie 16 als Basis angeben und dann mit bin in binär konvertieren.

34
Kasrâmvd

Sie können auf die Codewerte für die Zeichen in Ihrer Zeichenfolge mit der integrierten Funktion ord() zugreifen. Wenn Sie dies dann in binär formatieren müssen, erledigt die string.format()-Methode die Aufgabe.

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

(Vielen Dank an Ashwini Chaudhary für die Veröffentlichung dieses Code-Snippets.)

Während der obige Code in Python 3 funktioniert, wird diese Angelegenheit komplizierter, wenn Sie eine andere Codierung als UTF-8 verwenden. In Python 2 sind Zeichenfolgen Byte-Sequenzen, und die Kodierung ASCII wird standardmäßig angenommen. In Python 3 wird davon ausgegangen, dass Zeichenfolgen Unicode sind, und es gibt einen separaten bytes-Typ, der sich eher wie eine Python 2-Zeichenfolge verhält. Wenn Sie eine andere Kodierung als UTF-8 annehmen möchten, müssen Sie die Kodierung angeben.

In Python 3 können Sie also Folgendes tun:

a = "test"
a_bytes = bytes(a, "ascii")
print(' '.join(["{0:b}".format(x) for x in a_bytes]))

Die Unterschiede zwischen der UTF-8- und der ASCII-Kodierung sind für einfache alphanumerische Zeichenfolgen nicht offensichtlich, werden jedoch wichtig, wenn Sie Text verarbeiten, der Zeichen enthält, die nicht im ASCII-Zeichensatz enthalten.

15
Mark R. Wilkins

Wir müssen es nur kodieren.

'string'.encode('ascii')
10
Tao

Dies ist ein Update für die vorhandenen Antworten, die bytearray() verwendet haben und nicht mehr so ​​funktionieren können:

>>> st = "hello world"
>>> map(bin, bytearray(st))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string argument without an encoding

Wie in dem Link oben erläutert, müssen Sie, wenn die Quelle eine Zeichenfolge ist, auch Sie die Kodierung angeben:

>>> map(bin, bytearray(st, encoding='utf-8'))
<map object at 0x7f14dfb1ff28>
1

In Python Version 3.6 und höher können Sie 'f-string' verwenden, um das Ergebnis zu formatieren.

str = "hello world"
print(" ".join(f"{ord(i):08b}" for i in str))

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
  • Die linke Seite des Doppelpunkts, ord (i), ist das tatsächliche Objekt, dessen Wert formatiert und in die Ausgabe eingefügt wird. Wenn Sie ord () verwenden, erhalten Sie den Basis-10-Codepunkt für ein einzelnes str-Zeichen.

  • Die rechte Seite des Doppelpunkts ist der Formatbezeichner. 08 bedeutet Breite 8, 0 aufgefüllt, und das b fungiert als Vorzeichen, um die resultierende Zahl in der Basis 2 (binär) auszugeben.

0
Vlad Bezden
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 __== '__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 ist beim Konvertieren in ein Byte-Array wesentlich effizienter, da es Funktionsaufrufe auf niedriger Ebene durchführt, anstatt jedes Zeichen manuell in eine Ganzzahl umzuwandeln und dann diese Ganzzahl in ihren Binärwert zu konvertieren.

0
Ben