Existe-t-il un moyen efficace de vérifier si une chaîne est codée en base 64 avec python?
Je vous remercie
Ce n'est pas possible Le mieux que vous puissiez faire est de vérifier qu’une chaîne peut être valide en Base 64, bien que de nombreuses chaînes composées uniquement de texte ASCII puissent être décodées comme si elles étaient en Base 64.
import base64
import binascii
try:
base64.decodestring("foo")
except binascii.Error:
print "no correct base64"
Je cherchais une solution au même problème, puis une très simple m'a frappé à la tête. Tout ce que vous avez à faire est de décoder, puis de ré-encoder. Si la chaîne recodée est égale à la chaîne codée, elle est codée en base64.
Voici le code:
import base64
def isBase64(s):
try:
return base64.b64encode(base64.b64decode(s)) == s
except Exception:
return False
C'est tout!
Edit: Voici une version de la fonction qui fonctionne à la fois avec les objets string et bytes dans Python 3:
import base64
def isBase64(sb):
try:
if type(sb) == str:
# If there's any unicode here, an exception will be thrown and the function will return false
sb_bytes = bytes(sb, 'ascii')
Elif type(sb) == bytes:
sb_bytes = sb
else:
raise ValueError("Argument must be string or bytes")
return base64.b64encode(base64.b64decode(sb_bytes)) == sb_bytes
except Exception:
return False
si la longueur de la chaîne encodée est le temps de 4, elle peut être décodée
base64.encodestring("whatever you say").strip().__len__() % 4 == 0
alors, il vous suffit de vérifier si la chaîne peut correspondre à quelque chose comme ci-dessus, alors elle ne lèvera aucune exception (I Guess =. =)
if len(the_base64string.strip()) % 4 == 0:
# then you can just decode it anyway
base64.decodestring(the_base64string)
def is_base64(s):
s = ''.join([s.strip() for s in s.split("\n")])
try:
enc = base64.b64encode(base64.b64decode(s)).strip()
return enc == s
except TypeError:
return False
Dans mon cas, mon entrée, s
, avait des nouvelles lignes que je devais supprimer avant la comparaison.
x = 'possibly base64 encoded string'
result = x
try:
decoded = x.decode('base64', 'strict')
if x == decoded.encode('base64').strip():
result = decoded
except:
pass
ce code met dans la chaîne de résultat décodée la variable de résultat si x est réellement encodé, et juste si sinon. Essayer de décoder ne fonctionne pas toujours.
@geoffspear a raison de dire que ce n'est pas possible à 100% mais vous pouvez vous en rapprocher en vérifiant l'en-tête de la chaîne pour voir si elle correspond à celle d'une chaîne codée en base64 (re: Comment vérifier si une chaîne est codée en base64 ou non ).
# check if a string is base64 encoded.
def isBase64Encoded(s):
pattern = re.compile("^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$")
if not s or len(s) < 1:
return False
else:
return pattern.match(s)
De plus, dans mon cas, je voulais renvoyer la valeur false si la chaîne est vide pour éviter le décodage, car rien ne sert de décodage.