Ich brauche eine Möglichkeit, die binäre Darstellung eines Strings in Python zu erhalten. z.B
st = "hello world"
toBinary(st)
Gibt es ein Modul, mit dem man das ordentlich machen kann?
ord
Endnummer jedes Zeichens in (z. B. hexadezimal)?
Ich brauche eine Möglichkeit, die binäre Darstellung eines Strings in Python zu erhalten. z.B
st = "hello world"
toBinary(st)
Gibt es ein Modul, mit dem man das ordentlich machen kann?
ord
Endnummer jedes Zeichens in (z. B. hexadezimal)?
Antworten:
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, 'utf-8'))
'1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100'
' '.join('{0:08b}'.format(ord(x), 'b') for x in st)
, was etwa 35% schneller als die zfill(8)
Lösung ist (zumindest auf meinem Computer).
β
z. B. das, was mir 11001110 10110010
intern dargestellt wird?
Als pythonischere Methode können Sie Ihre Zeichenfolge zuerst in ein Byte-Array konvertieren und dann die folgende bin
Funktion verwenden map
:
>>> 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 Codierung 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 das binascii
Modul auch in Python 2 verwenden:
>>> import binascii
>>> bin(int(binascii.hexlify(st),16))
'0b110100001100101011011000110110001101111001000000111011101101111011100100110110001100100'
hexlify
Geben Sie die hexadezimale Darstellung der Binärdaten zurück. Anschließend können Sie sie in int konvertieren, indem Sie 16 als Basis angeben und sie dann mit in binär konvertieren bin
.
3.7.4
): (1) bytearray
eine Codierung (nicht nur eine Zeichenfolge) erwartet und (2) map(bin, ...)
das map
Objekt zurückgibt. Für den ersten Punkt verwende ich zum Beispiel bob
.encoding ('ascii') `, wie von @Tao vorgeschlagen. Für den zweiten Punkt zeigt die Verwendung der join
Methode wie in den anderen Beispielen von @Kasramvd das gewünschte Ergebnis an.
Wir müssen es nur verschlüsseln.
'string'.encode('ascii')
v3.7.4
) gibt dies ein bytes
Objekt zurück (mit den ASCII-Darstellungen jedes Bytes, falls verfügbar), und um seine Binärdarstellung anzuzeigen, benötige ich bin
z. B. mit ' '.join(item[2:] for item in map(bin, 'bob'.encode('ascii')))
(Hinweis, der 0b
am Anfang der Binärdarstellung entfernt werden muss jedes Zeichens).
Sie können mit der ord()
integrierten Funktion auf die Codewerte für die Zeichen in Ihrer Zeichenfolge zugreifen . Wenn Sie dies dann 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 das Posten dieses Code-Snippets.)
Während der obige Code in Python 3 funktioniert, wird diese Angelegenheit komplizierter, wenn Sie eine andere Codierung als UTF-8 annehmen. In Python 2 sind Zeichenfolgen Bytefolgen, und die ASCII-Codierung wird standardmäßig angenommen. In Python 3 wird angenommen, 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 Codierung als UTF-8 annehmen möchten, müssen Sie die Codierung 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 UTF-8- und ASCII-Codierung 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 sind.
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 eigentliche Objekt, dessen Wert formatiert und in die Ausgabe eingefügt wird. Mit ord () 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 Basis 2 (binär) auszugeben.
Dies ist ein Update für die vorhandenen Antworten, die verwendet wurden bytearray()
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
Denn wie im obigen Link erläutert, müssen Sie , wenn die Quelle eine Zeichenfolge ist, auch die folgende Codierung angeben :
>>> map(bin, bytearray(st, encoding='utf-8'))
<map object at 0x7f14dfb1ff28>
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 konvertiert wesentlich effizienter in ein Byte-Array, da es Funktionsaufrufe auf niedriger Ebene ausführt, anstatt jedes Zeichen manuell in eine Ganzzahl umzuwandeln und diese Ganzzahl dann in ihren Binärwert umzuwandeln.
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))