En suivant cet exemple de python , j'encode une chaîne en Base64 avec:
>>> import base64
>>> encoded = base64.b64encode(b'data to be encoded')
>>> encoded
b'ZGF0YSB0byBiZSBlbmNvZGVk'
Mais, si je laisse de côté le premier b
:
>>> encoded = base64.b64encode('data to be encoded')
J'obtiens l'erreur suivante:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python32\lib\base64.py", line 56, in b64encode
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
TypeError: expected bytes, not str
Pourquoi est-ce?
python
python-3.x
base64
dublintech
la source
la source
Réponses:
base64 l' encodage des données d'octets binaires de 8 bits et code pour qu'il utilise uniquement les caractères
A-Z
,a-z
,0-9
,+
,/
* afin qu'il puisse être transmis sur les canaux qui ne préservent pas les 8 bits de données, tels que le courrier électronique.Par conséquent, il veut une chaîne d'octets de 8 bits. Vous créez ceux-ci en Python 3 avec la
b''
syntaxe.Si vous supprimez le
b
, il devient une chaîne. Une chaîne est une séquence de caractères Unicode. base64 ne sait pas quoi faire avec les données Unicode, ce n'est pas du 8 bits. Ce n'est pas vraiment des morceaux, en fait. :-)Dans votre deuxième exemple:
Tous les caractères s'intègrent parfaitement dans le jeu de caractères ASCII, et l'encodage base64 est donc en fait un peu inutile. Vous pouvez le convertir en ascii à la place, avec
Ou plus simple:
Ce serait la même chose dans ce cas.
* La plupart des saveurs base64 peuvent également inclure un
=
à la fin comme rembourrage. De plus, certaines variantes base64 peuvent utiliser des caractères autres que+
et/
. Voir le tableau récapitulatif des variantes sur Wikipedia pour un aperçu.la source
Réponse courte
Vous devez pousser un
bytes-like
objet (bytes
,bytearray
, etc.) à labase64.b64encode()
méthode. Voici deux façons:Ou avec une variable:
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 unstring
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:
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 ):
base64
cependant, le codage regroupera ces données: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, lebase64
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:
Pourquoi utiliser l'
base64
encodage?Disons que je dois envoyer des données à quelqu'un par e-mail, comme ces données:
Il y a deux problèmes que j'ai plantés:
\x04
caractère aurait été lu, car il s'agit de ASCII pourEND-OF-TRANSMISSION
(Ctrl-D), de sorte que les données restantes seraient exclues de la transmission.BACKSPACE
caractères et troisSPACE
caractères pour effacer le «msg». Ainsi, même si je n'avais pas leEOF
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é.
la source
base64.b64encode(s.encode()).decode()
n'est pas très pythonique quand tout ce que vous voulez est une conversion de chaîne en chaîne.base64.encode(s)
devrait être suffisant au moins en python3. Merci pour une très bonne explication sur les chaînes et les octets en pythonbase64.encode(s)
ne fonctionnerait pas en Python3; dites-vous que quelque chose comme ça devrait être disponible? Je pense que la raison pour laquelle cela peut être déroutant est que, selon l'encodage et le contenu de la chaîne, il ses
peut qu'il n'y ait pas 1 représentation unique en tant que tableau d'octets.Si les données à encoder contiennent des caractères "exotiques", je pense que vous devez encoder en "UTF-8"
la source
Si la chaîne est Unicode, le moyen le plus simple est:
la source
Il y a tout ce dont vous avez besoin:
Le début
b
rend votre chaîne binaire.Quelle version de Python utilisez-vous? 2.x ou 3.x?
Edit: Voir http://docs.python.org/release/3.0.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit pour les détails sanglants des chaînes en Python 3.x
la source
Ce b signifie simplement que vous prenez l'entrée comme un octet ou un tableau d'octets et non comme une chaîne.
la source