【发布时间】:2018-10-02 13:17:17
【问题描述】:
我正在尝试将 Base64 编码的字符串转换为文本。我正在使用以下代码:
public static string Base64Decode(string base64EncodedData)
{
var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}
它确实可以工作,但它会在每个字符后放置空格。此外,它会在转换后的字符串的开头添加一个无效字符。 Base64 字符串中的内容是 XML,因此当它将其转换为文本并放置空格时,XML 变得无效。有没有其他选择?
这是转换后的示例输出:
? < ? x m l v e r s i o n = " 1 . 0 " e n c o d i n g = " U T F - 1 6 " s t a n d a l o n e = " n o " ? > < I m p o r t > < o p t i o n s > < P r o c N a m e > E R P N u m b e r < / P r o c N a m e > < J o b I D > A N L 0 0 1 8 5 0 < / J o b I D > < / o p t i o n s > < R o w > < D o c I d / > < E R P N u m b e r / > < / R o w > < / I m p o r t >
【问题讨论】:
-
您确定字符串是 utf8,而不是 utf16?请提供 base64 字符串的minimal reproducible example。
-
我假设传入的
base64EncodedData实际上是UTF-16编码的。尝试改用System.Text.Encoding.UTF16.GetString。 -
您需要两件事来将字节解释为文本:1) 字节,2) 字符编码。询问发件人,或者可能已经通过规范、标准、约定等传达给您。
-
@TomBlodget - 因为它实际上是 XML(可能在开头带有字节顺序标记),OP 可以返回一个字节数组,将其放入
MemoryStream,他们使用XmlReader.Create(Stream)来解析XML。我认为(但尚未检查)XmlReader将正确解释编码。或者如果确实有BOM,那么OP可以使用new StreamReader(Stream, true)来检测。 -
@dbc 是的,好点。知道字节是 XML 文档就足够了,因为 XML 标准有一个算法来确定字符编码。