Ik heb behoefte aan een manier om de binaire representatie van een string in python te krijgen. bijv.
st = "hello world"
toBinary(st)
Is er een module van een aantal nette manier om dit te doen?
Antwoord 1, Autoriteit 100%
zoiets?
>>> 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'
Antwoord 2, Autoriteit 46%
Als door binaire bedoel je bytes
het type, kunt u gewoon gebruik maken van encode
methode van de string object dat de string codeert als bytes object met de verstreken codeert type. Je hoeft alleen maar om ervoor te zorgen dat u een juiste codering naar encode
functie gaan.
In [9]: "hello world".encode('ascii')
Out[9]: b'hello world'
In [10]: byte_obj = "hello world".encode('ascii')
In [11]: byte_obj
Out[11]: b'hello world'
In [12]: byte_obj[0]
Out[12]: 104
Anders, als u ze wilt in de vorm van nullen en exemplaren – een voornaamste vertegenwoordiging – als een meer pythonische manier kunt u eerst uw tekenreeks naar byte array converteren en gebruikt u vervolgens bin
Functie in map
:
>>> st = "hello world"
>>> map(bin,bytearray(st))
['0b1101000', '0b1100101', '0b1101100', '0b1101100', '0b1101111', '0b100000', '0b1110111', '0b1101111', '0b1110010', '0b1101100', '0b1100100']
of u kunt eraan toetreden:
>>> ' '.join(map(bin,bytearray(st)))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'
Merk op dat in Python3 U moet een codering opgeven voor bytearray
functie:
>>> ' '.join(map(bin,bytearray(st,'utf8')))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'
U kunt ook binascii
MODULE IN PYTHON 2:
gebruiken
>>> import binascii
>>> bin(int(binascii.hexlify(st),16))
'0b110100001100101011011000110110001101111001000000111011101101111011100100110110001100100'
hexlify
retourneer de hexadecimale representatie van de binaire gegevens, dan kunt u deze converteren naar int door 16 als basis op te geven en deze vervolgens naar binair te converteren met bin
.
Antwoord 3, autoriteit 31%
We hoeven het alleen maar te coderen.
'string'.encode('ascii')
Antwoord 4, autoriteit 11%
Je hebt toegang tot de codewaarden voor de tekens in je string met behulp van de ingebouwde functie ord()
. Als u dit vervolgens in binair moet formatteren, zal de methode string.format()
het werk doen.
a = "test"
print(' '.join(format(ord(x), 'b') for x in a))
(Met dank aan Ashwini Chaudhary voor het plaatsen van dat codefragment.)
Hoewel de bovenstaande code werkt in Python 3, wordt deze kwestie ingewikkelder als je uitgaat van een andere codering dan UTF-8. In Python 2 zijn strings bytereeksen en wordt standaard uitgegaan van ASCII-codering. In Python 3 wordt aangenomen dat strings Unicode zijn, en er is een apart bytes
-type dat meer op een Python 2-string lijkt. Als u een andere codering dan UTF-8 wilt aannemen, moet u de codering specificeren.
In Python 3 kun je dan zoiets als dit doen:
a = "test"
a_bytes = bytes(a, "ascii")
print(' '.join(["{0:b}".format(x) for x in a_bytes]))
De verschillen tussen UTF-8 en ascii-codering zijn niet duidelijk voor eenvoudige alfanumerieke tekenreeksen, maar worden belangrijk als u tekst verwerkt die tekens bevat die niet in de ascii-tekenset voorkomen.
Antwoord 5, autoriteit 3%
In Python-versie 3.6 en hoger kunt u f-string om resultaat te formatteren.
str = "hello world"
print(" ".join(f"{ord(i):08b}" for i in str))
01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
-
De linkerkant van de Colon, Ord (I), is het eigenlijke object waarvan de waarde is
zal worden geformatteerd en ingevoegd in de uitvoer. Gebruik van Ord () geeft je
het basis-10-codepunt voor een teken van een strop. -
De rechterkant van de dikke darm is het formaatspecificator. 08 betekent
Breedte 8, 0 gevoerde en de B-functies als een bord om de
resulterend nummer in basis 2 (binair).
Antwoord 6
Dit is een update voor de bestaande antwoorden die bytearray()
en kan niet meer werken:
>>> st = "hello world"
>>> map(bin, bytearray(st))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: string argument without an encoding
Omdat, zoals uitgelegd in de bovenstaande link, als de bron een tekenreeks is, , moet u ook de codering geven:
>>> map(bin, bytearray(st, encoding='utf-8'))
<map object at 0x7f14dfb1ff28>
Antwoord 7
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 is aanzienlijk efficiënter bij het converteren naar een byte-array, omdat het functietroepen met een laag niveau maakt in plaats van het handmatig elk karakter in een geheel getal te transformeren en vervolgens dat geheel getal in zijn binaire waarde in te zetten.
Antwoord 8
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))