Hoe string om te zetten in binaire?

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 byteshet type, kunt u gewoon gebruik maken van encodemethode 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 encodefunctie 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 binFunctie 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 bytearrayfunctie:

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

U kunt ook binasciiMODULE IN PYTHON 2:

gebruiken

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

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

Other episodes