2017-07-02 116 views
1

工作我寫一個C#應用程序添加到該字符串解碼:Convert.FromBase64String不代碼工作,但在在線工具

「--W3sic3RhcnRfdGltZSI6IjAiLCJwcm9kdWN0X2lkIjoiODQwMDMzMDQiLCJ1cmwiOiIifSx7InN0YXJ0X3RpbWUiOiI3OSIsInByb2R1Y3RfaWQiOiI4NDAzNjk2MSIsInVybCI6IiJ9LHsic3RhcnRfdGltZSI6IjgyIiwicHJvZHVjdF9pZCI6Ijg0MDAzMDIwIiwidXJsIjoiIn0seyJzdGFydF90aW1lIjoiMTA5IiwicHJvZHVjdF9pZCI6IiIsInVybCI6Imh0dHBzOi8vYmxvZy5sYXJlaW5lZHVzaG9wcGluZy5jYS8yMDE3LzAxL3RyYW5zZm9ybWVyLXNlcy12aWV1eC1nYW50cy1kZS1jdWlyLWVuLTUtbWludXRlcy8ifV0 =」

它的工作原理,當我複製/粘貼它這個在線工具:

System.FormatException:https://www.base64decode.org

但是當我使用Convert.FromBase64String(str)它拋出一個異常的輸入是不是有效的Base-64字符串,因爲它含有 非基礎最多64個字符,多於兩個填充字符,或者在填充字符中存在非法字符 。

爲什麼?

+2

刪除 「 - 」 – Parker

+0

爲什麼呢?這是有效的Base64字符 – Darius

+1

這篇文章可能會回答你的問題。 https://stackoverflow.com/questions/15114044/the-input-is-not-a-valid-base-64-string-as-it-contains-a-non-base-64-character – EntryLeveDeveloper

回答

4

URL解碼將從base64字符串中刪除+使其無效。沒有理由投票給我指出它。其他人閱讀這個問題將使用該代碼,它是有缺陷的。如果解碼'a + ==',結果將是字符'k'。如果使用URL Decoding解碼'a + ==',則URL解碼會將字符串轉換爲'a ==',您將嘗試解碼該異常。

簡而言之,.Net框架正在使用Base64編碼的變體,該變體不允許無效字符,並且該網站使用的PHP正在使用允許無效字符丟棄的另一種變體。

Base64編碼將三個八位字節轉換爲四個編碼字符。有效字符用於Base64編碼的64個字符的第一個62:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

有幾種變體,其允許字符62和63在C#不同的字符,如最常見的變體中,完整的字符集是:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/= 

https://msdn.microsoft.com/en-us/library/dhx0d524(v=vs.110).aspx

基部-64以升序從數字零是大寫 字符 「A」 到 「Z」 中,LO wercase字符「a」到「z」, 數字「0」到「9」以及符號「+」和「/」。無價值的 字符「=」用於結尾填充。

此變種已知是針對RFC 3548或RFC 4648標準的「base64」編碼,除非另有說明,否則無效值將被禁止。

PHP使用Base64傳輸編碼的MIME(RFC 2045),它允許無效的字符,但放棄它們。

在所有其他Base64變體中,禁止使用無效字符。

如果原始Base64實際上應該包含-字符,它將使用不同的變體。

請參見:https://en.wikipedia.org/wiki/Base64#Variants_summary_table

3

您的代碼不是有效的Base64字符串。字符串開頭的 - 字符無效。你可以這樣轉換它。

using System; 
using System.Text; 

var decodedString = "--W3sic3RhcnRfdGltZSI6IjAiLCJwcm9kdWN0X2lkIjoiODQwMDMzMDQiLCJ1cmwiOiIifSx7InN0YXJ0X3RpbWUiOiI3OSIsInByb2R1Y3RfaWQiOiI4NDAzNjk2MSIsInVybCI6IiJ9LHsic3RhcnRfdGltZSI6IjgyIiwicHJvZHVjdF9pZCI6Ijg0MDAzMDIwIiwidXJsIjoiIn0seyJzdGFydF90aW1lIjoiMTA5IiwicHJvZHVjdF9pZCI6IiIsInVybCI6Imh0dHBzOi8vYmxvZy5sYXJlaW5lZHVzaG9wcGluZy5jYS8yMDE3LzAxL3RyYW5zZm9ybWVyLXNlcy12aWV1eC1nYW50cy1kZS1jdWlyLWVuLTUtbWludXRlcy8ifV0=" 
    .Replace("-", ""); 
var bytes = Convert.FromBase64String(decodedString); 
var encodedString = Encoding.UTF8.GetString(bytes); 
Console.WriteLine(encodedString); 
+0

Net使用base64變體,其中'-'不是允許的字符。 –

相關問題