总之表,您可以:
- 分割上是无效的base64数据或填充任何字符的字符串
- 尝试每个令牌
- 转换,如果转换成功,调用替换上原始的字符串以与转换的值
切换令牌在代码:
var delimiters = new char[] { /* non-base64 ASCII chars */ };
var possibles = value.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
//need to tweak to include padding chars in matches, but still split on padding?
//maybe better off creating a regex to match base64 + padding
//and using Regex.Split?
foreach(var match in possibles)
{
try
{
var converted = Convert.FromBase64String(match);
var text = System.Text.Encoding.UTF8.GetString(converted);
if(!string.IsNullOrEmpty(text))
{
value = value.Replace(match, text);
}
}
catch (System.ArgumentNullException)
{
//handle it
}
catch (System.FormatException)
{
//handle it
}
}
尽管没有分隔符,但您最终可能会将非base64文本转换为base64编码文本。在你试图"Hello QXdlc29tZQ== World"
转换为"Hello Awesome World"
上述算法可以很容易地通过尝试从BASE64整个字符串转换因为是平原和编码的文本之间没有分隔符产生类似"ée¡Ý•Í½µ”¢¹]"
例如
展望。
更新(基于评论):
如果没有'\n'
S IN以base64内容,它总是由"Content-Transfer-Encoding: base64\n"
前面,那么还有一个办法:
- 各执
'\n'
串
- 迭代所有令牌,直到令牌结束
"Content-Transfer-Encoding: base64"
- 下一个令牌(如果有的话)应该被解码(如果可能的话),然后替换应该是ma德在原始字符串
- 返回迭代,直到出令牌
在代码:
private string ConvertMixedUpTextAndBase64(string value)
{
var delimiters = new char[] { '\n' };
var possibles = value.Split(delimiters,
StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < possibles.Length - 1; i++)
{
if (possibles[i].EndsWith("Content-Transfer-Encoding: base64"))
{
var nextTokenPlain = DecodeBase64(possibles[i + 1]);
if (!string.IsNullOrEmpty(nextTokenPlain))
{
value = value.Replace(possibles[i + 1], nextTokenPlain);
i++;
}
}
}
return value;
}
private string DecodeBase64(string text)
{
string result = null;
try
{
var converted = Convert.FromBase64String(text);
result = System.Text.Encoding.UTF8.GetString(converted);
}
catch (System.ArgumentNullException)
{
//handle it
}
catch (System.FormatException)
{
//handle it
}
return result;
}
以任何方式限定以base64内容? – jball 2010-10-04 18:22:19
这是一个XY问题。真正的问题是X:你是怎么得到这样一个字符串的。 – 2010-10-04 19:18:26
@Hans Passant我同意,我试图编写一个工具来修复某些首先损坏的数据。我们已经修复了制作损坏数据的部分,但现在我们必须在大约300万条记录上修复它。 – Adam 2010-10-04 20:39:17