繁体   English   中英

将Base64转换为字符串会插入空格

[英]Converting Base64 to string inserts whitespaces

我正在尝试将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 > 

看起来原始二进制数据已使用UTF-16字符串转换为字节,该字符串与文本的encoding="UTF-16"部分匹配。 将二进制数据转换回字符串时,需要使用正确的编码:

return Encoding.Unicode.GetString(base64EncodedBytes);

前提是您一开始就无法更改生成数据的内容。 如果您可以将其更改为使用UTF-8,那么如果文本全部为ASCII字符,则最终将获得一半的数据...

正如Jon Skeet回答中解释的那样,该字符串似乎是用UTF-16而不是UTF-8编码的。

你还写了

此外,它在转换后的字符串的开头添加了无效字符。

这个无效字符几乎可以肯定是一个字节顺序标记 ,这是一个小的字节序,表示流中使用的特定编码。 给定它的存在,您可以配置一个StreamReader来检测通过使用new StreamReader(Stream, true)构造函数指定的编码:

public static string Base64Decode(string base64EncodedData)
{
    var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
    using (var reader = new StreamReader(new MemoryStream(base64EncodedBytes), true))
    {
        return reader.ReadToEnd();
    }
}

请注意, StreamReader将在处理期间消耗字节顺序标记,因此它不包含在返回的字符串中。

另外,由于您的base64数据实际上是XML,并且XML包含其自己的编码声明 ,因此您可以提取字节数组并使用XmlReader直接对其进行解析:

public static XmlReader CreateXmlReaderFromBase64(string base64EncodedData, XmlReaderSettings settings = null)
{
    var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
    return XmlReader.Create(new MemoryStream(base64EncodedBytes), settings);
}

根据docsXmlReader.Create(Stream)将根据需要检测编码:

XmlReader扫描流的第一个字节,以查找字节顺序标记或其他编码符号。 确定编码后,将使用编码继续读取流,然后处理继续将输入解析为(Unicode)字符流。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM