2016-10-05 3 views
1

Ich habe eine Zeichenfolge, die eine Zahl in Hex darstellt, und ich möchte es in Base-64 konvertieren. Wie mache ich das und wie funktioniert dieser Vorschlag? Da muss ich verstehen, wie es funktioniert.Hex zu Base-64 und anderen Basen

Das erste, woran ich dachte, war (ich bin ein Noob), der einen einfachen Algorithmus implementiert, der so vorgeht wie bei der Arbeit mit Stift und Papier, obwohl ich mir vorstelle, dass Python solche Sachen "eingebaut" hat.

Ich kann dies durch die Suche im Internet implementieren, aber ich muss verstehen, wie es funktioniert.

Einige Beispielfragen Sie eine Vorstellung von den Erklärungen zu geben, ich brauche:

  • Wenn Ihre Antwort-Strings des Typs erfordert b'...' könnten Sie bitte erklären, was sie sind und warum tut b64encode() scheint nur zu akzeptieren Objekte dieser Typ als Argumente?
  • Warum funktioniert int() nur bis Base-36 und wie kann ich im Allgemeinen die Konvertierung zwischen verschiedenen Basen ordentlich handhaben und könnten Sie eine weitere Erklärung geben, wenn Ihre Lösung diese Funktion beinhaltet?

Also wenn mir jemand hier ein paar Hinweise geben könnte. Ich kann nicht viel aus der Dokumentation extrahieren, da diese Art von Wissen bereits zu erwarten ist.

Danke.

+0

Als eine schnelle Schätzung der Basis 36 Problem möglicherweise nur Codierung (26 Buchstaben und 10 Ziffern zu kodieren ist alles, was Sie ausgeben müssen mit '10 = A') – AER

+0

Gibt es noch andere Funktionen wie int(), die ich kann Verwenden Sie, um zwischen Basen> 36 so kurz wie möglich zu konvertieren? – scarlett

+0

In Bezug auf Ihre Frage zu Strings der Form 'b" hi scarlett "' sehen Sie diese Frage: http://stackoverflow.com/questions/6269765/what-does-the-b-character-do-in-front- of-a-string-literal –

Antwort

2

hier ein Code zu konvertieren, die Sie von einem Hex-String in einen b64 codierte Zeichenfolge der Umwandlung Trog der Prozess geht.

import base64 
x=int('0xABCDEF01',base=16) 
print("x : ",x) 
b=x.to_bytes(length=4,byteorder='big') 
print("b : ",b) 
e=base64.b64encode(b) 
print("e : ",e) 
b2=base64.b64decode(e) 
print("b2 : ",int(b2.hex(),base=16)) 

Ausgang:

x : 2882400001 
b : b'\xab\xcd\xef\x01' 
e : b'q83vAQ==' 
b2 : 2882400001 

Einige (lange) Erklärungen: so dass wir mit einem Hex in einer Zeichenkette beginnen, nichts Besonderes, nehmen int es zusammen mit der Basis in eine reguläre Ganzzahl zu drehen x . Zu Python x ist ein Bündel von Bits, die eine Zahl darstellen, die die meiste Zeit in Basis 10 gedruckt wird. Wir können die Bit-Darstellung mit x.to_bytes fragen. Das Ergebnis ist eine Sequenz von Bytes, die als b'...' gedruckt werden, beachten Sie, dass der Druckprozess automatisch versucht, die Bytes in ASCII-Zeichen oder zu etwas wie \xab zu konvertieren, wenn das angegebene Byte nicht mit einem ASCII-Zeichen verknüpft ist.Also füttern wir dann die Bytes zu b64encode, die normalerweise verwendet wird, um Dateien daher diese Byte-Objekt-Anforderung zu verarbeiten, und es spuckt eine ascii-Zeichenfolge als ein Byte-Objekt. Mit diesem Ergebnis ist der umgekehrte Prozess ähnlich: b64 ascii-String -> Binärzahl in Bytes -> hex -> int.

+0

'b64encode' gibt eine ASCII-Zeichenkette zurück? So zum Beispiel das erste' q' in ' e "ist ein Byte, das den Wert 113 enthält? Für den Computer ist diese Zeichenfolge eine andere Nummer als die, die sie für uns darstellt (eine Zahl in der Basis 64)? – scarlett

+0

Base64 orignal Zweck ist, rohe Datenbytes zu nehmen (die möglicherweise nicht als ASCII gedruckt werden können) und wandeln sie in eine ASCII-Sequenz um, die in eine Textnachricht kopiert/eingefügt werden kann, um ein Beispiel zu geben. Also ** die tatsächliche/erwartete Ausgabe von b64 ist die Folge von Zeichen, die Sie lesen können **. Aber wie Sie bemerkt haben, sind diese Zeichen für den Computer (und für Python) nur eine Folge von Bytes; Um Python zu verdeutlichen, dass es sich tatsächlich um eine Folge von ASCII-Zeichen handelt, müßte man 'e.decode (" ascii ")' 'nennen. – jadsq

1

nehmen Eingabe von 'aaccffdde5e5ff'

import binascii,base64 
input_str = 'aaccffdde5e5ff' 
dehexed_str = binascii.unhexlify(input_str) 
base64_str = base64.b64encode(dehexed_str) 

b'...' ist nur Bytestring Sie eine normale Unicode-String in Bytes mit

as_bytes = u'hello world'.encode('utf-8') kodieren, können

willkürlichen Basis Umwandlung handhaben zu Base10 dies sehen Anleitung

http://mathbits.com/MathBits/CompSci/Introduction/tobase10.htm

hier ist eine Funktion eine beliebige Zeichenfolge in jedem Alphabet Dezimalbasis 10

def int10(s,alphabet): 
    base = len(alphabet) 
    return sum([alphabet.index(c)*base**i for i,c in enumerate(s[::-1])]) 

hexAlphabet="abcdef" 
print(int10('f3',hexAlphabet))