2017-04-04 4 views
3

Ich habe ein Problem mit der Umwandlung einer Base64-codierten Zeichenfolge in binäre. Ich sammle die Fingerprint2D in dem folgenden Link,Python von base64 in binär konvertieren

url = "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/108770/property/Fingerprint2D/xml" 

Fingerprint2D=AAADccB6OAAAAAAAAAAAAAAAAAAAAAAAAAA8WIEAAAAAAACxAAAAHgAACAAADAzBmAQwzoMABgCI AiTSSACCCAAhIAAAiAEMTMgMJibMsZuGeijn4BnI+YeQ0OMOKAACAgAKAABQAAQEABQAAAAAAAAA AA== 

Die descriptiong im PubChem sagt, dass dies 115-Byte-String, und es sollte 920 Bits sein, wenn in binären umgewandelt. Ich versuche es mit dem folgenden auf den binären zu konvertieren,

response = requests.get(url) 
    tree = ET.fromstring(response.text) 

    for el in tree[0]: 
     if "Fingerprint2D" in el.tag: 
      fpp = bin(int(el.text, 16)) 
      print(len(fpp)) 

Wenn ich den obigen Code verwenden, ich die folgende Fehlermeldung erhalten: „Fehler Wert: ungültige wörtliche für int() mit Base16:

Und wenn ich den Code unten verwenden, die Länge der fpp (binär) gleich 1278, das nicht das, was ich erwartet hatte.

response = requests.get(url) 
    tree = ET.fromstring(response.text) 

    for el in tree[0]: 
     if "Fingerprint2D" in el.tag: 
      fpp = bin(int(hexlify(el.text), 16)) 
      print(len(fpp)) 

Danke schon viel !!

Antwort

1

base64-Format dekodieren Sie müssen passiert ein bytes Objekt an die base64.decodebytes Funktion:

import base64 

t = "AAADccB6OAAAAAAAAAAAAAAAAAAAAAAAAAA8WIEAAAAAAACxAAAAHgAACAAADAzBmAQwzoMABgCI AiTSSACCCAAhIAAAiAEMTMgMJibMsZuGeijn4BnI+YeQ0OMOKAACAgAKAABQAAQEABQAAAAAAAAA AA==".encode("ascii") 

decoded = base64.decodebytes(t) 

print(decoded) 
print(len(decoded)*8) 

ich folgende:

b'\x00\x00\x03q\xc0z8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<X\x81\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x1e\x00\x00\x08\x00\x00\x0c\x0c\xc1\x98\x040\xce\x83\x00\x06\x00\x88\x02$\xd2H\x00\x82\x08\x00! \x00\x00\x88\x01\x0cL\xc8\x0c&&\xcc\xb1\x9b\x86z(\xe7\xe0\x19\xc8\xf9\x87\x90\xd0\xe3\x0e(\x00\x02\x02\x00\n\x00\x00P\x00\x04\x04\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00' 
920 

So 920 Bits, wie erwartet.

Daten zu erhalten, wie binäre auf dem Bytes durchläuft gerade und konvertieren zu 8 Stellen mit format und Zero-Padding Binär (bin fügt einen 0b Header, so dass es nicht geeignet ist), und join die Saiten zusammen:

print("".join(["{:08b}".format(x) for x in decoded])) 

ergibt:

00000000000000000000001101110001110000000111101000111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011110001011000100000010000000000000000000000000000000000000000000000001011000100000000000000000000000000011110000000000000000000001000000000000000000000001100000011001100000110011000000001000011000011001110100000110000000000000110000000001000100000000010001001001101001001001000000000001000001000001000000000000010000100100000000000000000000010001000000000010000110001001100110010000000110000100110001001101100110010110001100110111000011001111010001010001110011111100000000110011100100011111001100001111001000011010000111000110000111000101000000000000000001000000010000000000000101000000000000000000101000000000000000001000000010000000000000101000000000000000000000000000000000000000000000000000000000000000000 

(die 920 Zeichen ist, wie erwartet)

+0

Für Binärausgang Ich habe eine Zeichenfolge wie "0001001 .." erwartet, oder muss ich eine binäre Konvertierung für die "decodierte" Ausgabe durchführen? –

+0

verstanden. Siehe meine Bearbeitung. –

+0

Danke! Eine weitere Sache, die ich nicht verstehen konnte, ist die Länge der resultierenden binären Zeichenfolge 423, können wir sagen, dass wir die erwarteten 920 Bits perfekt decodiert haben? Gibt es keine Möglichkeit, eine binäre Zeichenfolge der Länge 920 abzurufen? –

Verwandte Themen