Réponse courte
Vous devez pousser un bytes-like
objet ( bytes
, bytearray
, etc.) à la base64.b64encode()
méthode. Voici deux façons:
>>> data = base64.b64encode(b'data to be encoded')
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'
Ou avec une variable:
>>> string = 'data to be encoded'
>>> data = base64.b64encode(string.encode())
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'
Pourquoi?
Dans Python 3, les str
objets ne sont pas des tableaux de caractères de style C (ils ne sont donc pas des tableaux d'octets), mais plutôt des structures de données qui n'ont pas de codage inhérent. Vous pouvez coder cette chaîne (ou l'interpréter) de différentes manières. L'utf-8 est le plus courant (et par défaut dans Python 3), d'autant plus qu'il est rétrocompatible avec ASCII (bien que, comme le sont les encodages les plus utilisés). C'est ce qui se passe lorsque vous prenez un string
et appelez la .encode()
méthode dessus: Python interprète la chaîne dans utf-8 (l'encodage par défaut) et vous fournit le tableau d'octets auquel il correspond.
Encodage Base-64 en Python 3
À l'origine, le titre de la question portait sur l'encodage Base-64. Lisez la suite pour les trucs Base-64.
base64
l'encodage prend des morceaux binaires de 6 bits et les encode en utilisant les caractères AZ, az, 0-9, '+', '/' et '=' (certains encodages utilisent des caractères différents à la place de '+' et '/') . Il s'agit d'un codage de caractères basé sur la construction mathématique du système numérique radix-64 ou base-64, mais ils sont très différents. La base-64 en mathématiques est un système de nombres comme binaire ou décimal, et vous effectuez ce changement de radix sur le nombre entier, ou (si le radix que vous convertissez est une puissance de 2 inférieure à 64) en morceaux de droite à la gauche.
En base64
encodage, la traduction se fait de gauche à droite; ces 64 premiers caractères sont la raison pour laquelle il est appelé base64
encodage . Le 65ème symbole `` = '' est utilisé pour le remplissage, car l'encodage tire des morceaux de 6 bits mais les données qu'il est généralement destiné à coder sont des octets de 8 bits, donc parfois il n'y a que deux ou 4 bits dans le dernier morceau.
Exemple:
>>> data = b'test'
>>> for byte in data:
... print(format(byte, '08b'), end=" ")
...
01110100 01100101 01110011 01110100
>>>
Si vous interprétez ces données binaires comme un seul entier, voici comment vous les convertissez en base-10 et base-64 ( tableau pour base-64 ):
base-2: 01 110100 011001 010111 001101 110100 (base-64 grouping shown)
base-10: 1952805748
base-64: B 0 Z X N 0
base64
cependant, le codage regroupera ces données:
base-2: 011101 000110 010101 110011 011101 00(0000) <- pad w/zeros to make a clean 6-bit chunk
base-10: 29 6 21 51 29 0
base-64: d G V z d A
Donc, 'B0ZXN0' est la version base 64 de notre binaire, mathématiquement parlant. Cependant, l' base64
encodage doit effectuer l'encodage dans la direction opposée (de sorte que les données brutes sont converties en 'dGVzdA') et a également une règle pour indiquer aux autres applications combien d'espace est laissé à la fin. Cela se fait en remplissant la fin avec des symboles «=». Ainsi, le base64
codage de ces données est 'dGVzdA ==', avec deux symboles '=' pour signifier deux paires de bits devront être supprimés de la fin lorsque ces données seront décodées pour les faire correspondre aux données d'origine.
Testons cela pour voir si je suis malhonnête:
>>> encoded = base64.b64encode(data)
>>> print(encoded)
b'dGVzdA=='
Pourquoi utiliser l' base64
encodage?
Disons que je dois envoyer des données à quelqu'un par e-mail, comme ces données:
>>> data = b'\x04\x6d\x73\x67\x08\x08\x08\x20\x20\x20'
>>> print(data.decode())
>>> print(data)
b'\x04msg\x08\x08\x08 '
>>>
Il y a deux problèmes que j'ai plantés:
- Si j'essayais d'envoyer cet e-mail sous Unix, l'e-mail serait envoyé dès que le
\x04
caractère aurait été lu, car il s'agit de ASCII pour END-OF-TRANSMISSION
(Ctrl-D), de sorte que les données restantes seraient exclues de la transmission.
- De plus, bien que Python soit suffisamment intelligent pour échapper à tous mes mauvais caractères de contrôle lorsque j'imprime directement les données, lorsque cette chaîne est décodée en ASCII, vous pouvez voir que le «msg» n'est pas là. C'est parce que j'ai utilisé trois
BACKSPACE
caractères et trois SPACE
caractères pour effacer le «msg». Ainsi, même si je n'avais pas le EOF
caractère là-bas, l'utilisateur final ne serait pas en mesure de traduire du texte à l'écran vers les vraies données brutes.
Ceci est juste une démo pour vous montrer combien il peut être difficile d'envoyer simplement des données brutes. L'encodage des données au format base64 vous donne exactement les mêmes données mais dans un format qui garantit qu'elles peuvent être envoyées sur des supports électroniques tels que les e-mails en toute sécurité.