2012-07-24 49 views
24

我想:轉換和背部

  1. 生成的字節數組。
  2. 將該字節數組轉換爲base64
  3. 將該base64字符串轉換回字節數組。

我試過了一些解決方案,例如那些在這個question

由於某些原因,初始字節數組和最終字節數組不匹配。這裏所使用的代碼:

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider()) 
    { 
     byte[] originalArray = new byte[32]; 
     rng.GetBytes(key); 
     string temp_inBase64 = Convert.ToBase64String(originalArray); 
     byte[] temp_backToBytes = Encoding.UTF8.GetBytes(temp_inBase64); 
    } 

我的問題是:

  1. 爲什麼 「originalArray」 和 「temp_backToBytes」 不匹配? (originalArray的長度爲32,temp_backToBytes的長度爲44,但它們的值也不同)

  2. 是否可以來回轉換,如果有,我該如何實現?

回答

30

編碼數組長度大約四分之一的原因是base-64編碼只使用每個字節中的六位;那就是它存在的原因 - 以適合於通過諸如電子郵件之類的僅ASCII通道交換的方式編碼任意數據,可能具有零和其他不可打印字符。

您使用Convert.FromBase64String讓您的原始數組回是這樣的:

byte[] temp_backToBytes = Convert.FromBase64String(temp_inBase64); 
+0

這工作,但如果只的base64使用6每8位的,我想編碼會更短? – crawfish 2012-07-24 15:47:53

+6

@crawfish編碼在輸出中使用8位中的6位,使兩個最重要的位置零。結果,每個三字節組('3 * 8 = 24'位)變爲一組四字節('4 * 6 = 24'位)。如果原稿中的字節數不能被3整除,則會在末尾添加特殊標記。在你的情況下,可以被大於32的3整除的下一個數字是33或者「11 * 3」。這意味着結果是「11 * 4」或44個字節長。 – dasblinkenlight 2012-07-24 15:57:13

+0

非常感謝您的解釋 – crawfish 2012-07-24 17:29:58