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个样本.问题是内容......从一个记录到下一个记录变化很大.
没有可靠的方法来做到这一点.你怎么知道,例如,"Hello"不是base64字符串?好吧,这是一个不好的例子,因为base64应该被填充,因此长度是4的倍数,但是"溢出"呢?它是8个字符长,它是一个有效的base64字符串(它将解码为"¢÷«~Z0"),即使它显然是人类读者的正常单词.你无法确定一个单词是普通单词还是base64编码文本.
你在正常文本中嵌入了base64编码文本的事实显然是一个设计错误,我建议你做一些事情,而不是尝试做一些不可能的事情......
简而言之,您可以:
\n\n在代码中:
\n\nvar 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}\nRun 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如果base64内容中没有\'\\n\'s并且前面总是有"Content-Transfer-Encoding: base64\\n",那么有一种方法:
\'\\n\'"Content-Transfer-Encoding: base64"在代码中:
\n\nprivate 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}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
10871 次 |
| 最近记录: |