有没有一种好方法可以验证字符串是否使用python在base 64中编码?
谢谢
答案 0 :(得分:31)
import base64
import binascii
try:
base64.decodestring("foo")
except binascii.Error:
print "no correct base64"
答案 1 :(得分:18)
我一直在寻找解决同样问题的方法,然后一个非常简单的解决方案让我头疼。您需要做的就是解码,然后重新编码。如果重新编码的字符串等于编码的字符串,则它是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 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
答案 2 :(得分:8)
这是不可能的。您可以做的最好的方法是验证字符串可能是有效的Base 64,尽管许多仅由ASCII文本组成的字符串可以被解码,就好像它们是Base 64一样。
答案 3 :(得分: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)
答案 4 :(得分: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
有新行,我必须在比较之前删除。
答案 5 :(得分:1)
使用Python RegEx
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")
答案 6 :(得分:1)
我知道我已经晚了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()
答案 7 :(得分:1)
在尝试解码之前,我喜欢先进行格式检查,因为这是最轻量级的检查,并且不会返回误报,因此遵循 fail-fast 编码原则。
这是此任务的实用函数:
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
答案 8 :(得分: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。只是尝试解码并不总是有效。
答案 9 :(得分:0)
@geoffspear是正确的,因为这不可能100%,但是您可以通过检查字符串标题是否与base64编码的字符串(re:How to check whether a string is base64 encoded or not)相匹配,来接近目标。
# 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以避免解码,因为没有任何用处。
答案 10 :(得分:0)
我使用的解决方案基于先前的答案之一,但是使用了更多最新的呼叫。
在我的代码中,my_image_string要么是原始格式的图像数据本身,要么是base64字符串。如果解码失败,那么我认为它是原始数据。
请注意validate=True
的{{1}}关键字参数。为了使断言由解码器生成,这是必需的。没有它,就不会有关于非法字符串的投诉。
b64decode