首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检查有效的Base64编码字符串

如何检查有效的Base64编码字符串
EN

Stack Overflow用户
提问于 2011-06-11 00:31:30
回答 19查看 167.8K关注 0票数 148

在C#中,除了尝试转换字符串并查看是否存在错误之外,是否有其他方法可以查看字符串是否为base64编码?我的代码是这样的:

代码语言:javascript
复制
// 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“都是有效的。

代码语言:javascript
复制
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倍。

我相信有一天,使用基于异常的方法进行测试会变得更好。我只是不知道这是什么意思。

EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2011-06-11 00:35:41

更新:对于更新版本的C#,有一个更好的替代方案,请参考下面Tomas的答案。

识别Base64字符串非常容易,因为它只由字符'A'..'Z', 'a'..'z', '0'..'9', '+', '/'组成,并且通常在末尾填充多达三个'=',以使长度是4的倍数。但是,如果发生异常,最好忽略它,而不是比较这些值。

票数 51
EN

Stack Overflow用户

发布于 2019-01-11 17:13:05

使用C# 7.2中的Convert.TryFromBase64String

代码语言:javascript
复制
public static bool IsBase64String(string base64)
{
   Span<byte> buffer = new Span<byte>(new byte[base64.Length]);
   return Convert.TryFromBase64String(base64, buffer , out int bytesParsed);
}
票数 88
EN

Stack Overflow用户

发布于 2014-01-21 03:12:14

我知道你说过你不想抓到异常。但是,因为捕获异常更可靠,所以我将继续并发布这个答案。

代码语言:javascript
复制
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以进一步提高可靠性。

票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6309379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档