簡體   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