在C#中,除了尝试转换字符串并查看是否存在错误之外,是否有其他方法可以查看字符串是否为base64编码?我的代码是这样的:
// Convert base64-encoded hash value into a byte array.
byte[] HashBytes = Convert.FromBase64String(Value);
我希望避免在值不是有效的base64字符串时发生的“Base-64字符串中的无效字符”异常。我只想检查并返回false,而不是处理异常,因为我希望这个值有时不会是base64字符串。在使用Convert.FromBase64String函数之前,有没有什么方法可以检查一下?
谢谢!
更新:
谢谢你所有的回答。这是一个到目前为止你都可以使用的扩展方法,它可以确保你的字符串可以无异常地传递Convert.FromBase64String。.NET在转换到64位时似乎忽略了所有尾随和结束空格,所以" 1234“和”1234“都是有效的。
public static bool IsBase64String(this string s)
{
s = s.Trim();
return (s.Length % 4 == 0) && Regex.IsMatch(s, @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None);
}
对于那些想知道测试与捕获和异常的性能的人来说,在大多数情况下,对于这个base64的东西,检查要比捕获异常快,直到你达到一定的长度。长度越小越快
在我非常不科学的测试中:对于字符长度为100,000 - 110000的10000次迭代,它比第一次测试快2.7倍。
对于1000次迭代,字符长度为1- 16个字符,总共有16,000个测试,速度是10.9倍。
我相信有一天,使用基于异常的方法进行测试会变得更好。我只是不知道这是什么意思。
发布于 2011-06-11 00:35:41
更新:对于更新版本的C#,有一个更好的替代方案,请参考下面Tomas的答案。
识别Base64字符串非常容易,因为它只由字符'A'..'Z', 'a'..'z', '0'..'9', '+', '/'
组成,并且通常在末尾填充多达三个'=',以使长度是4的倍数。但是,如果发生异常,最好忽略它,而不是比较这些值。
发布于 2019-01-11 17:13:05
使用C# 7.2中的Convert.TryFromBase64String
public static bool IsBase64String(string base64)
{
Span<byte> buffer = new Span<byte>(new byte[base64.Length]);
return Convert.TryFromBase64String(base64, buffer , out int bytesParsed);
}
发布于 2014-01-21 03:12:14
我知道你说过你不想抓到异常。但是,因为捕获异常更可靠,所以我将继续并发布这个答案。
public static bool IsBase64(this string base64String) {
// Credit: oybek https://stackoverflow.com/users/794764/oybek
if (string.IsNullOrEmpty(base64String) || base64String.Length % 4 != 0
|| base64String.Contains(" ") || base64String.Contains("\t") || base64String.Contains("\r") || base64String.Contains("\n"))
return false;
try{
Convert.FromBase64String(base64String);
return true;
}
catch(Exception exception){
// Handle the exception
}
return false;
}
更新:我已经更新了条件,这要归功于oybek以进一步提高可靠性。
https://stackoverflow.com/questions/6309379
复制相似问题