如何检查一个字符串是否为Base64编码

282

我希望解码一个Base64编码的字符串,并将其存储在我的数据库中。如果输入不是Base64编码,我需要抛出错误。

如何检查一个字符串是否为Base64编码?


1
为什么?这种情况怎么会出现? - user207421
3
这是一个非常开放的问题,没有指定你要针对哪种编程语言和/或操作系统。 - bcarroll
12
你所能确定的是该字符串仅包含在Base64编码字符串中有效的字符。但可能无法确定该字符串是否为某些数据的Base64编码版本。例如,test1234是一个有效的Base64编码字符串,解码后会得到一些字节。没有应用程序独立的方法可以得出test1234不是Base64编码字符串的结论。 - Kinjal Dixit
https://play.golang.org/p/RnEBFCJ9h0 - BentCoder
25个回答

0

这在Python中可行:

def is_base64(string):
    if len(string) % 4 == 0 and re.test('^[A-Za-z0-9+\/=]+\Z', string):
        return(True)
    else:
        return(False)

0

对于Java版本,我实际上使用以下正则表达式:

"([A-Za-z0-9+]{4})*([A-Za-z0-9+]{3}=|[A-Za-z0-9+]{2}(==){0,2})?"

在某些情况下,它也可以选择使用==

最好!


0

当你知道原始内容的长度(例如校验和)时,此代码片段可能非常有用。它检查编码形式是否具有正确的长度。

public static boolean isValidBase64( final int initialLength, final String string ) {
  final int padding ;
  final String regexEnd ;
  switch( ( initialLength ) % 3 ) {
    case 1 :
      padding = 2 ;
      regexEnd = "==" ;
      break ;
    case 2 :
      padding = 1 ;
      regexEnd = "=" ;
      break ;
    default :
      padding = 0 ;
      regexEnd = "" ;
  }
  final int encodedLength = ( ( ( initialLength / 3 ) + ( padding > 0 ? 1 : 0 ) ) * 4 ) ;
  final String regex = "[a-zA-Z0-9/\\+]{" + ( encodedLength - padding ) + "}" + regexEnd ;
  return Pattern.compile( regex ).matcher( string ).matches() ;
}

0
如果在解码时我们得到一个由ASCII字符组成的字符串,那么这个字符串就没有被编码过。 (RoR) Ruby解决方案:
def encoded?(str)
  Base64.decode64(str.downcase).scan(/[^[:ascii:]]/).count.zero?
end

def decoded?(str)
  Base64.decode64(str.downcase).scan(/[^[:ascii:]]/).count > 0
end

-3

我尝试使用这个,是的,这个可以使用。

^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$

但我添加了一个条件来检查至少字符的结尾是否为=

string.lastIndexOf("=") >= 0

为什么要检查 =:您使用的是哪个 Base64 规范?什么是“字符结尾”,非负数的 lastIndexOf() 如何进行检查? - greybeard
我的base64字符大部分情况下总是以=结尾。 - Ashadi Sedana Pratama
2
并非所有的base64编码字符串都以=结尾,例如:rYNltxhaxFAdr3ex8JFFtyCWHNRLCKyPyYei3xo05yHJEXmh3GZQxWm0NSP3tWBkMoIqrHQibfQmYpw-i6TspDJ0M3A1Z1FRWU1wM3V3aGZ1eTViOGJk。 - Michael Draper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接