verify是一个在base64 python中编码的字符串

liz*_*zie 23 python base64

是否有一种很好的方法来验证字符串是否使用python在base 64中编码?

谢谢

小智 33

import base64
import binascii

try:
    base64.decodestring("foo")
except binascii.Error:
    print "no correct base64"
Run Code Online (Sandbox Code Playgroud)

  • 这是不正确的,`base64.decodestring('čččč')`返回一个空字符串,没有异常,但我不认为字符串čččč是有效的base64 (16认同)
  • 如果 `s` 有效,`base64.b64decode(s, validate=true)` 将解码它,否则抛出异常。`base64.decodestring` 非常宽松,会删除任何可能存在问题的非 Base64 字符。 (4认同)
  • "更容易请求宽恕而非许可",虽然我可能更喜欢捕捉可能被提出的实际异常(我认为这将是binascii.Error) (3认同)
  • base64.decodestring("dfdsfsdf ds fk")也没有引发TypeError,该字符串似乎不是base64字符串 (2认同)

id0*_*d01 21

我正在寻找解决同样问题的方法,然后一个非常简单的解决方案让我头疼.您需要做的就是解码,然后重新编码.如果重新编码的字符串等于编码的字符串,则它是base64编码的.
这是代码:

import base64

def isBase64(s):
    try:
        return base64.b64encode(base64.b64decode(s)) == s
    except Exception:
        return False
Run Code Online (Sandbox Code Playgroud)

而已!

编辑:这是一个与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
Run Code Online (Sandbox Code Playgroud)

  • `isBase64('test')` 返回真 (4认同)
  • 在 Python3 上,因为 `str` 和 `bytes` 比较不会将它们隐式转换为相同类型(为了比较)我不得不做 `return base64.b64encode(base64.b64decode(s)).decode() == s`为了这个工作。因为我的 `s` 是一个 unicode `str` 而从 `base64.b64encode(base64.b64decode(s))` 返回的值是 `bytes`。看到这个:/sf/ask/2140627051/ (4认同)
  • 旁注:你总是可以`返回base64.b64encode(base64.b64decode(s))== s`而不是使用if语句并返回一个常量bool结果:) (2认同)
  • @ahmed 那是因为“test”是一个有效的 base64 字符串。Base64 包括用于填充的 az、AZ、0-9、+、/ 和 =。 (2认同)

Woo*_*ble 9

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

  • 这真的是答案吗? (2认同)
  • @ coler -j是的,技术上是正确的.它也可能应该是一个评论,但在2012年,SO是不同的.也许. (2认同)

Mik*_*eyB 6

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

在我的代码中, 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
Run Code Online (Sandbox Code Playgroud)


Nan*_*ram 5

使用 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")
Run Code Online (Sandbox Code Playgroud)