如何检查string是否是base64编码的
我想解码base64编码的string,然后将其存储在我的数据库。 如果input不base64编码,则需要抛出错误。 我如何检查string是否被base64编码?
你可以使用下面的正则expression式来检查一个string是否是base64编码的:
^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$
在base64编码中,字符集是[AZ, az, 0-9, and + /]
。 如果剩余长度小于4,则string用'='
字符填充。
^([A-Za-z0-9+/]{4})*
表示string以0或更多的base64组开始。
([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$
表示string以三种forms之一结束: [A-Za-z0-9+/]{4}
, [A-Za-z0-9+/]{3}=
或[A-Za-z0-9+/]{2}==
。
那么你可以:
- 检查长度是4个字符的倍数
- 检查每个字符是否在集合AZ,az,0-9,+,/中,除了末尾的填充是0,1或2'='字符
如果你期望它是base64,那么你可能只需要使用你的平台上可用的任何库来尝试将其解码为一个字节数组,并抛出一个exception,如果它不是有效的base64。这取决于你的平台,当然。
如果你使用的是Java,你实际上可以使用commons-codec库
import org.apache.commons.codec.binary.Base64; String stringToBeChecked = "..."; boolean isBase64 = Base64.isArrayByteBase64(stringToBeChecked.getBytes());
尝试像这样的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"; }
请检查IF如果string的长度是4的倍数。下面使用这个正则expression式来确保string中的所有字符都是64位的字符。
\A[a-zA-Z\d\/+]+={,2}\z
如果您使用的库添加换行符作为观察每行规则的最大字符数为76的方法,请将其replace为空string。
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'); }
Base64有许多变种 ,所以可以考虑只是确定你的string是否类似于你期望处理的变种 。 因此,您可能需要针对索引和填充字符(即+
, /
, =
)调整下面的正则expression式。
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?
从Java 8开始,您可以简单地使用java.util.Base64来尝试和解码string:
String someString = "..."; Base64.Decoder decoder = Base64.getDecoder(); try { decoder.decode(someString); } catch(IllegalArgumentException iae) { // That string wasn't valid. }
C#这是很好的performance:
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; }
除了系统中的string有一些特定的限制或标识之外,没有办法区分string和base64编码。
当你知道原始内容的长度(例如校验和)时,这个片段可能会很有用。 它检查编码forms是否具有正确的长度。
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不起作用,并且您知道原始string的格式样式,则可以通过重新格式化此格式来反转逻辑。
例如,我使用base64编码的XML文件,只是检查文件是否包含有效的XML标记。 如果不行,我可以假设,它是base64解码。 这不是很有活力,但适合我的小应用程序。
尝试这个:
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"); } }
这在Python中起作用:
def is_base64(string): if len(string) % 4 == 0 and re.test('^[A-Za-z0-9+\/=]+\Z', string): return(True) else: return(False)
尝试使用前面提到的正则expression式:
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"); }
…我们也可以做一个简单的validation,如果有空格就不能是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"); }
import org.apache.commons.codec.binary.Base64; … Base64.isBase64(string)