我想解码base64编码的字符串,然后将其存储在我的数据库中。如果输入不是base64编码,我需要抛出一个错误。如何检查字符串是否为base64编码?
答案 0 :(得分:204)
您可以使用以下正则表达式检查字符串是否为base64编码:
^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$
在base64编码中,字符集为[A-Z, a-z, 0-9, and + /]
。如果剩余长度小于4,则字符串将填充'='
个字符。
^([A-Za-z0-9+/]{4})*
表示字符串以0或更多base64组开头。
([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$
表示字符串以三种形式之一结尾:[A-Za-z0-9+/]{4}
,[A-Za-z0-9+/]{3}=
或[A-Za-z0-9+/]{2}==
。
答案 1 :(得分:44)
如果您使用的是Java,则实际上可以使用commons-codec库
import org.apache.commons.codec.binary.Base64;
String stringToBeChecked = "...";
boolean isBase64 = Base64.isArrayByteBase64(stringToBeChecked.getBytes());
答案 2 :(得分:41)
你可以:
如果您希望将作为base64,那么您可以使用平台上可用的任何库来尝试将其解码为字节数组,如果它不是有效的基础64则抛出异常。当然,这取决于你的平台。
答案 3 :(得分:11)
尝试使用PHP5
//where $json is some data that can be base64 encoded
$json=some_data;
//this will check whether data is base64 encoded or not
if (base64_decode($json, true) == true)
{
echo "base64 encoded";
}
else
{
echo "not base64 encoded";
}
答案 4 :(得分:7)
从Java 8开始,您只需使用java.util.Base64来尝试解码字符串:
String someString = "...";
Base64.Decoder decoder = Base64.getDecoder();
try {
decoder.decode(someString);
} catch(IllegalArgumentException iae) {
// That string wasn't valid.
}
答案 5 :(得分:5)
检查 IF 字符串的长度是4的倍数。使用此正则表达式确保字符串中的所有字符为base64个字符。
<强> \A[a-zA-Z\d\/+]+={,2}\z
强>
如果您使用的库添加换行符作为观察每行最多76个字符规则的方法,请用空字符串替换它们。
答案 6 :(得分:5)
var base64Rejex = /^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=|[A-Z0-9+\/]{4})$/i;
var isBase64Valid = base64Rejex.test(base64Data); // base64Data is the base64 string
if (isBase64Valid) {
// true if base64 formate
console.log('It is base64');
} else {
// false if not in base64 formate
console.log('it is not in base64');
}
答案 7 :(得分:4)
有很多variants of Base64,所以请考虑确定您的字符串是否类似您希望处理的变量。因此,您可能需要根据索引和填充字符(即+
,/
,=
)调整下面的正则表达式。
class String
def resembles_base64?
self.length % 4 == 0 && self =~ /^[A-Za-z0-9+\/=]+\Z/
end
end
用法:
raise 'the string does not resemble Base64' unless my_string.resembles_base64?
答案 8 :(得分:2)
试试这个:
public void checkForEncode(String string) {
String pattern = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(string);
if (m.find()) {
System.out.println("true");
} else {
System.out.println("false");
}
}
答案 9 :(得分:1)
无法检查字符串是否为base64编码。只能验证该字符串是否为base64编码的字符串格式,这意味着它可能是base64编码生成的字符串(要检查字符串是否可以针对正则表达式进行验证,或者可以使用库,很多该问题的其他答案提供了检查此问题的好方法,因此我将不赘述。
例如,字符串flow
是有效的base64编码的字符串。但是无法知道它仅仅是一个简单的字符串,一个英语单词flow
,还是以64位编码的字符串~Z0
答案 10 :(得分:1)
<强> C#强> 这表现很好:
static readonly Regex _base64RegexPattern = new Regex(BASE64_REGEX_STRING, RegexOptions.Compiled);
private const String BASE64_REGEX_STRING = @"^[a-zA-Z0-9\+/]*={0,3}$";
private static bool IsBase64(this String base64String)
{
var rs = (!string.IsNullOrEmpty(base64String) && !string.IsNullOrWhiteSpace(base64String) && base64String.Length != 0 && base64String.Length % 4 == 0 && !base64String.Contains(" ") && !base64String.Contains("\t") && !base64String.Contains("\r") && !base64String.Contains("\n")) && (base64String.Length % 4 == 0 && _base64RegexPattern.Match(base64String, 0).Success);
return rs;
}
答案 11 :(得分:1)
/^([A-Za-z0-9+\/]{4})*([A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}==)$/
这个正则表达式帮助我在rails中识别我的应用程序中的base64,我只有一个问题,就是它识别字符串“errorDescripcion”,我生成错误,解决它只是验证字符串的长度。
答案 12 :(得分:0)
Function Check_If_Base64(ByVal msgFile As String) As Boolean
Dim I As Long
Dim Buffer As String
Dim Car As String
Check_If_Base64 = True
Buffer = Leggi_File(msgFile)
Buffer = Replace(Buffer, vbCrLf, "")
For I = 1 To Len(Buffer)
Car = Mid(Buffer, I, 1)
If (Car < "A" Or Car > "Z") _
And (Car < "a" Or Car > "z") _
And (Car < "0" Or Car > "9") _
And (Car <> "+" And Car <> "/" And Car <> "=") Then
Check_If_Base64 = False
Exit For
End If
Next I
End Function
Function Leggi_File(PathAndFileName As String) As String
Dim FF As Integer
FF = FreeFile()
Open PathAndFileName For Binary As #FF
Leggi_File = Input(LOF(FF), #FF)
Close #FF
End Function
答案 13 :(得分:0)
如果解码时我们得到一个带有ASCII字符的字符串,则该字符串为 未编码
(RoR)红宝石解决方案:
def encoded?(str)
Base64.decode64(str.downcase).scan(/[^[:ascii:]]/).count.zero?
end
def decoded?(str)
Base64.decode64(str.downcase).scan(/[^[:ascii:]]/).count > 0
end
答案 14 :(得分:0)
这在Python中有效:
import base64
def IsBase64(str):
try:
base64.b64decode(str)
return True
except Exception as e:
return False
if IsBase64("ABC"):
print("ABC is Base64-encoded and its result after decoding is: " + str(base64.b64decode("ABC")).replace("b'", "").replace("'", ""))
else:
print("ABC is NOT Base64-encoded.")
if IsBase64("QUJD"):
print("QUJD is Base64-encoded and its result after decoding is: " + str(base64.b64decode("QUJD")).replace("b'", "").replace("'", ""))
else:
print("QUJD is NOT Base64-encoded.")
摘要::如果IsBase64("string here")
是Base64编码的,string here
返回 true ,并且返回如果string here
不是Base64编码的,则为 false 。
答案 15 :(得分: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)
答案 16 :(得分:0)
如果RegEx不起作用并且您知道原始字符串的格式样式,则可以通过重新格式化此格式来反转逻辑。
例如,我使用base64编码的xml文件,只检查文件是否包含有效的xml标记。如果不是,我可以假设它已经解码了base64。这不是很动态,但适用于我的小应用程序。
答案 17 :(得分: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() ;
}
答案 18 :(得分:0)
除了系统中的字符串有一些特定的限制或标识外,没有办法区分字符串和base64编码。
答案 19 :(得分:-1)
使用之前提到的正则表达式尝试此操作:
String regex = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";
if("TXkgdGVzdCBzdHJpbmc/".matches(regex)){
System.out.println("it's a Base64");
}
...我们也可以做一个简单的验证,如果它有空格,它不能是Base64:
String myString = "Hello World";
if(myString.contains(" ")){
System.out.println("Not B64");
}else{
System.out.println("Could be B64 encoded, since it has no spaces");
}
答案 20 :(得分:-1)
我尝试使用它,是的,它正在工作
^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$
但是我添加了一个条件,以检查至少字符的末尾是=
string.lastIndexOf("=") >= 0