46

有没有一种好方法可以检查字符串是否base64使用 Python 编码?

4

11 回答 11

65

我一直在寻找相同问题的解决方案,然后一个非常简单的解决方案让我大吃一惊。您需要做的就是解码,然后重新编码。如果重新编码的字符串等于编码的字符串,那么它是 base64 编码的。
这是代码:

import base64

def isBase64(s):
    try:
        return base64.b64encode(base64.b64decode(s)) == s
    except Exception:
        return False

而已!

编辑:这是在 Python 3 中同时适用于字符串和字节对象的函数版本:

import base64

def isBase64(sb):
        try:
                if isinstance(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 isinstance(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
于 2017-08-28T22:27:52.260 回答
38
import base64
import binascii

try:
    base64.decodestring("foo")
except binascii.Error:
    print "no correct base64"
于 2012-09-07T09:32:39.743 回答
18

这是不可能的。您可以做的最好的事情是验证一个字符串可能是有效的 Base 64,尽管许多仅由 ASCII 文本组成的字符串可以像 Base 64 一样被解码。

于 2012-09-07T11:14:30.623 回答
7

我使用的解决方案基于先前的答案之一,但使用了更多最新的调用。

在我的代码中,my_image_string 要么是原始形式的图像数据本身,要么是 base64 字符串。如果解码失败,那么我认为它是原始数据。

注意 的validate=True关键字参数 b64decode。这是解码器生成断言所必需的。没有它,就不会有关于非法字符串的投诉。

import base64, binascii

try:
    image_data = base64.b64decode(my_image_string, validate=True)
except binascii.Error:
    image_data = my_image_string
于 2019-05-04T17:35:23.210 回答
2

如果编码字符串的长度是4的倍数,则可以解码

base64.encodestring("whatever you say").strip().__len__() % 4 == 0

所以,你只需要检查字符串是否可以匹配上面的内容,那么它不会抛出任何异常(我猜 =.=)

if len(the_base64string.strip()) % 4 == 0:
    # then you can just decode it anyway
    base64.decodestring(the_base64string)
于 2016-11-03T03:29:39.377 回答
2

在尝试解码之前,我喜欢先进行格式检查,因为它是最轻量级的检查,并且不会返回误报,因此遵循快速失败的编码原则。

这是此任务的实用程序函数:

RE_BASE64 = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$"
def likeBase64(s:str) -> bool:
    return False if s is None or not re.search(RE_BASE64, s) else True
于 2021-04-23T01:56:02.947 回答
2

我知道我迟到了将近 8 年,但您可以使用正则表达式,因此您可以验证给定的输入是否为 BASE64。

import re

encoding_type = 'Encoding type: '
base64_encoding = 'Base64'


def is_base64():
    element = input("Enter encoded element: ")
    expression = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$"

    matches = re.match(expression, element)

    if matches:
        print(f"{encoding_type + base64_encoding}")
    else:
        print("Unknown encoding type.")


is_base64()
于 2020-08-23T11:59:24.003 回答
2

@geoffspear 是正确的,因为这不是 100% 可能的,但是您可以通过检查字符串标头以查看它是否与 base64 编码的字符串匹配(re:如何检查字符串是否为 base64 编码)非常接近。

# 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)

也不是在我的情况下,如果字符串为空以避免解码,我想返回 false ,因为解码没有任何用处。

于 2018-10-02T10:42:35.127 回答
2

使用 Python 正则表达式

import re

txt = "VGhpcyBpcyBlbmNvZGVkIHRleHQ="
x = re.search("^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$", txt)

if (x):
  print("Encoded")
else:
  print("Non encoded")
于 2020-01-09T04:54:57.577 回答
1
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

就我而言,我的输入 ,s有换行符,在比较之前我必须去掉这些换行符。

于 2016-01-08T18:11:01.807 回答
0
x = 'possibly base64 encoded string'
result = x
try:
   decoded = x.decode('base64', 'strict')
   if x == decoded.encode('base64').strip():
       result = decoded
except:
   pass

如果 x 确实被编码,则此代码放入结果变量解码字符串,如果没有,则只放入 x。只是尝试解码并不总是有效。

于 2015-07-22T14:48:59.530 回答