RegEx解析或验证Base64数据是否可以使用RegEx来验证或清理Base64数据?这是一个简单的问题,但推动这个问题的因素是让它变得困难的因素。我有一个Base64解码器,不能完全依赖输入数据来遵循RFC规范。所以,我面临的问题可能是Base64数据可能没有被分解成78个问题(我认为它是78,我必须仔细检查RFC,所以如果确切的数字是错误的话,请不要告诉我)线条,或线条可能不以CRLF结尾; 因为它可能只有CR,或LF,或者两者都没有。所以,我有一段时间解析Base64数据格式。因此,以下示例变得不可能可靠地解码。为简洁起见,我只会显示部分MIME标头。Content-Transfer-Encoding: base64VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu好的,所以解析没问题,这正是我们所期望的结果。在99%的情况下,使用任何代码来至少验证缓冲区中的每个字符都是有效的base64字符,完美地运行。但是,下一个例子会给混合物带来麻烦。Content-Transfer-Encoding: base64
http://www.stackoverflow.comVGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu我在一些病毒和其他试图利用某些邮件阅读器的东西中看到的Base64编码版本希望不惜一切代价解析mime,而不是严格按照本书,或者说RFC; 如果你愿意的话。我的Base64解码器将第二个示例解码为以下数据流。请记住,原始流是所有ASCII数据![0x]86DB69FFFC30C2CB5A724A2F7AB7E5A307289951A1A5CC81A5CC81CDA5B5C1B19481054D0D2524810985CD94D8D08199BDC8814DD1858DAD3DD995C999B1BDDC8195E1B585C1B194B8任何人都有一个很好的方法来解决这两个问题?我不确定它是否可能,除了对应用了不同规则的数据进行两次转换,并比较结果之外。但是,如果采用这种方法,您信任哪个输出?似乎ASCII启发式算法是最好的解决方案,但是代码,执行时间和复杂性会增加多少像病毒扫描程序一样复杂的东西,这个代码实际上涉及到什么?您如何训练启发式引擎以了解什么是可接受的Base64,什么不是?更新:对于这个问题继续得到的观点数量,我已经决定发布我已经在C#应用程序中使用的简单RegEx 3年了,有数十万个事务。老实说,我喜欢Gumbo给出的最好的答案,这就是我选择它作为选定答案的原因。但是对于任何使用C#的人来说,并且寻找一种非常快速的方法来至少检测字符串或byte []是否包含有效的Base64数据,我发现以下内容对我来说非常有用。[^-A-Za-z0-9+/=]|=[^=]|={3,}$是的,这仅适用于Base64数据的STRING,而不是格式正确的RFC1341消息。因此,如果您正在处理此类数据,请在尝试使用上述RegEx之前将其考虑在内。如果您正在处理Base16,Base32,Radix甚至Base64用于其他目的(URL,文件名,XML编码等),那么强烈建议您阅读Gumbo在其答案中提到的RFC4648,因为您需要做得好在尝试使用此问题/答案集中的建议之前,请了解实现所使用的字符集和终止符。
3 回答
慕的地6264312
TA贡献1817条经验 获得超6个赞
^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
这个很好,但会匹配一个空字符串
这个与空字符串不匹配:
^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$
- 3 回答
- 0 关注
- 760 浏览
添加回答
举报
0/150
提交
取消