RegEx解析或验证Base64数据
是否可以使用RegEx来验证或清除Base64数据?这是一个简单的问题,但是导致这个问题的因素是什么使它变得困难。 我有一个Base64解码器,它不能完全依赖输入数据来遵循RFC规范。因此,我面临的问题是可能未将Base64数据分解为78(我认为是78,我必须仔细检查RFC,因此如果确切的数字有误,请不要给我发声)字符。行,或者行不能以CRLF结尾;因为它可能只有CR或LF,也可能没有。 因此,我很难解析这样格式化的Base64数据。因此,无法可靠地解码以下示例。为了简洁起见,我将仅显示部分MIME标头。 Content-Transfer-Encoding: base64 VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu 好的,所以解析没有问题,而正是我们期望的结果。在99%的情况下,使用任何代码至少验证缓冲区中的每个字符都是有效的base64字符,都可以正常工作。但是,下一个示例将一把扳手扔进了锅里。 Content-Transfer-Encoding: base64 http://www.stackoverflow.com VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu 这是Base64编码的一种版本,在一些病毒和其他东西中,我已经看到它们试图利用某些邮件阅读器,他们希望不惜一切代价来解析mime,而不是严格按照书本或RFC进行解析。如果可以的话。 我的Base64解码器将第二个示例解码为以下数据流。请记住,原始流是所有ASCII数据! [0x]86DB69FFFC30C2CB5A724A2F7AB7E5A307289951A1A5CC81A5CC81CDA5B5C1B19481054D0D 2524810985CD94D8D08199BDC8814DD1858DAD3DD995C999B1BDDC8195E1B585C1B194B8 任何人都有同时解决两个问题的好方法吗?我不确定是否有可能,除了对数据应用了不同的规则进行两次转换并比较结果之外。但是,如果您采用这种方法,那么您信任哪个输出?看来ASCII启发式技术是最好的解决方案,但实际上,该代码涉及的病毒扫描程序又要复杂多少呢?代码,执行时间和复杂性又会增加多少呢?您将如何训练启发式引擎来了解什么是可接受的Base64,什么不是? 更新: 对于这个问题继续得到的观点,我决定发布一个简单的RegEx,该正则表达式已经在C#应用程序中使用了3年,涉及数十万笔交易。老实说,我最喜欢Gumbo给出的答案,这就是为什么我选择它作为选定答案。但是对于使用C#并寻找一种至少能检测出一个字符串或byte []是否包含有效Base64数据的快速方法的人,我发现以下内容对我来说非常有效。 [^-A-Za-z0-9+/=]|=[^=]|={3,}$ 是的,这仅适用于STRING的Base64数据,而不是格式正确的RFC1341消息。因此,如果您要处理此类数据,请在尝试使用上述RegEx之前将其考虑在内。如果您出于其他目的(URL,文件名,XML编码等)使用Base16,Base32,Radix或什至Base64,那么强烈建议您阅读Gumbo在其回答中提到的RFC4648,因为您需要保持良好状态在尝试使用此问题/答案集中的建议之前,请了解实现所使用的字符集和终止符。