我想解码Base64编码的字符串,然后将其存储在数据库中。如果输入不是Base64编码的,我需要抛出一个错误。
如何检查字符串是否为Base64编码?
test1234
是一个有效的base64编码的字符串,解码时会得到一些字节。没有独立于test1234
base64编码的字符串的独立于应用程序的结论方法。
我想解码Base64编码的字符串,然后将其存储在数据库中。如果输入不是Base64编码的,我需要抛出一个错误。
如何检查字符串是否为Base64编码?
test1234
是一个有效的base64编码的字符串,解码时会得到一些字节。没有独立于test1234
base64编码的字符串的独立于应用程序的结论方法。
Answers:
您可以使用以下正则表达式来检查字符串是否为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}==
。
abcd
将匹配,但不一定代表i·
普通abcd
输入的编码值
"pass"
是完全有效的BASE64字符串,解码为字节序列0xa5
,0xab
和0x2c
。如果您没有更多的上下文来决定,为什么要先验地放弃它?
如果您使用的是Java,则实际上可以使用commons-codec库
import org.apache.commons.codec.binary.Base64;
String stringToBeChecked = "...";
boolean isBase64 = Base64.isArrayByteBase64(stringToBeChecked.getBytes());
isArrayByteBase64(byte[] arrayOctet)
不推荐使用。1.5使用isBase64(byte[])
,将在2.0中删除。
stringToBeChecked="some plain text"
它会设置boolean isBase64=true
。阅读commons-codec-1.4的源代码,Base64.isArrayByteBase64()
它仅检查字符串中的每个字符对于Base64编码均有效,并允许空白。
好吧,您可以:
如果您期望它将是base64,那么您可以使用平台上可用的任何库尝试将其解码为字节数组,如果它不是有效的base 64则抛出异常。这取决于您的平台,当然。
从Java 8开始,您可以简单地使用java.util.Base64尝试对字符串进行解码:
String someString = "...";
Base64.Decoder decoder = Base64.getDecoder();
try {
decoder.decode(someString);
} catch(IllegalArgumentException iae) {
// That string wasn't valid.
}
像这样为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";
}
将此用于PHP7
//$string parameter can be base64 encoded or not
function is_base64_encoded($string){
//this will check if $string is base64 encoded and return true, if it is.
if (base64_decode($string, true) !== false){
return true;
}else{
return false;
}
}
Returns FALSE if input contains character from outside the base64 alphabet.
base64_decode
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');
}
请检查IF字符串的长度是4 Aftwerwards使用这个表达式来确保多的所有字符的字符串中的数据为base64字符。
\A[a-zA-Z\d\/+]+={,2}\z
如果您使用的库添加了一个换行符,以观察每行最多76个字符,请用空字符串替换它们。
试试这个:
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");
}
}
/^([A-Za-z0-9+\/]{4})*([A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}==)$/
这个正则表达式帮助我在Rails的应用程序中识别了base64,我只有一个问题,那就是它识别字符串“ errorDescripcion”,我生成一个错误,要解决这个问题,只需验证字符串的长度即可。
errorDescription
是有效的base64字符串时,它解码成字节二进制序列(十六进制): 7a ba e8 ac 37 ac 72 b8 a9 b6 2a 27
。
这适用于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")
返回真,如果string here
是Base64编码,并返回假,如果string here
不是Base64编码。
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;
}
Console.WriteLine("test".IsBase64()); // true
当您知道原始内容的长度(例如校验和)时,此片段可能会很有用。它检查编码形式的长度是否正确。
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() ;
}
如果RegEx不起作用,并且您知道原始字符串的格式样式,则可以通过对该格式进行正则表达式来反转逻辑。
例如,我使用base64编码的xml文件,只是检查文件是否包含有效的xml标记。如果没有,我可以假设它是base64解码的。这不是很动态,但是对于我的小型应用程序来说效果很好。
使用前面提到的正则表达式尝试以下操作:
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");
}
如果在解码时我们得到一个带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
我尝试使用它,是的,它正在工作
^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$
但我在条件上添加了至少检查字符结尾是否为=
string.lastIndexOf("=") >= 0
=
:Base64
您使用的是什么规格?这end of the character
是什么意思lastIndexOf()
?非负数如何检查呢?