确定字符串是否包含其中的base64字符串

Ada*_*dam 5 .net c# string parsing

我试图找出一种方法来解析一个更大的字符串的base64字符串.

我有字符串"Hello <base64 content> World",我希望能够解析base64内容并将其转换回字符串."Hello Awesome World"

C#中的答案首选.

编辑:更新了一个更实际的例子.

--abcdef
\n
Content-Type: Text/Plain;
Content-Transfer-Encoding: base64
\n
<base64 content>
\n
--abcdef--
Run Code Online (Sandbox Code Playgroud)

这取自1个样本.问题是内容......从一个记录到下一个记录变化很大.

Tho*_*que 8

没有可靠的方法来做到这一点.你怎么知道,例如,"Hello"不是base64字符串?好吧,这是一个不好的例子,因为base64应该被填充,因此长度是4的倍数,但是"溢出"呢?它是8个字符长,它是一个有效的base64字符串(它将解码为"¢÷«~Z0"),即使它显然是人类读者的正常单词.你无法确定一个单词是普通单词还是base64编码文本.

你在正常文本中嵌入了base64编码文本的事实显然是一个设计错误,我建议你做一些事情,而不是尝试做一些不可能的事情......


jba*_*all 4

简而言之,您可以:

\n\n
    \n
  • 将字符串拆分为无效的 Base64 数据或填充的任何字符
  • \n
  • 尝试转换每个令牌
  • \n
  • 如果转换成功,则对原始字符串调用replace,将token与转换后的值进行切换
  • \n
\n\n

在代码中:

\n\n
var delimiters = new char[] { /* non-base64 ASCII chars */ };\nvar possibles = value.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);\n//need to tweak to include padding chars in matches, but still split on padding?\n//maybe better off creating a regex to match base64 + padding\n//and using Regex.Split?\n\nforeach(var match in possibles)\n{\n    try\n    {\n        var converted = Convert.FromBase64String(match);\n        var text = System.Text.Encoding.UTF8.GetString(converted);\n        if(!string.IsNullOrEmpty(text))\n        {\n            value = value.Replace(match, text);\n        }\n    } \n    catch (System.ArgumentNullException) \n    {\n        //handle it\n    }\n    catch (System.FormatException) \n    {\n        //handle it\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,如果没有分隔符,您最终可能会转换恰好也有效的 Base64 编码文本的非 Base64 文本。

\n\n

查看尝试转换"Hello QXdlc29tZQ== World""Hello Awesome World"上述算法的示例,可以轻松生成类似尝试"\xc3\xa9e\xc2\xa1\xc3\x9d\xe2\x80\xa2\xc3\x8d\xc2\xbd\xc2\xb5\xe2\x80\x9d\xc2\xa2\xc2\xb9]"从 Base64 转换整个字符串的内容,因为纯文本和编码文本之间没有分隔符。

\n\n

更新(基于评论):

\n\n

如果base64内容中没有\'\\n\'s并且前面总是有"Content-Transfer-Encoding: base64\\n",那么有一种方法:

\n\n
    \n
  • 将字符串拆分为\'\\n\'
  • \n
  • 迭代所有标记,直到标记以"Content-Transfer-Encoding: base64"
  • \n
  • 应解码下一个标记(如果有)(如果可能),然后在原始字符串中进行替换
  • \n
  • 返回迭代,直到用完令牌
  • \n
\n\n

在代码中:

\n\n
private string ConvertMixedUpTextAndBase64(string value)\n{\n    var delimiters = new char[] { \'\\n\' };\n    var possibles = value.Split(delimiters, \n                                StringSplitOptions.RemoveEmptyEntries);\n\n    for (int i = 0; i < possibles.Length - 1; i++)\n    {\n        if (possibles[i].EndsWith("Content-Transfer-Encoding: base64"))\n        {\n            var nextTokenPlain = DecodeBase64(possibles[i + 1]);\n            if (!string.IsNullOrEmpty(nextTokenPlain))\n            {\n                value = value.Replace(possibles[i + 1], nextTokenPlain);\n                i++;\n            }\n        }                \n    }\n    return value;\n}\n\nprivate string DecodeBase64(string text)\n{\n    string result = null;\n    try\n    {\n        var converted = Convert.FromBase64String(text);\n        result = System.Text.Encoding.UTF8.GetString(converted);\n    }\n    catch (System.ArgumentNullException)\n    {\n        //handle it\n    }\n    catch (System.FormatException)\n    {\n        //handle it\n    }\n    return result;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 最后一部分是棘手的部分。例如,如果您拆分并获得“aaBG”作为字符串,您会做什么?这是“i F”的 Base64 表示。您需要一些启发来决定哪一个是您真正想要的。 (2认同)