2012-07-24 10 views
24

私がしようとしています:をbase64にバイト配列からの変換とバック

  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

エンコードされた配列の長さが約4分の1になるのは、base-64エンコーディングがすべてのバイトのうち6ビットのみを使用するためです。その理由は、電子メールなどのASCII専用チャンネルを介したやりとりに適した方法で、ゼロやその他の印刷不可能な文字を含む任意のデータをエンコードすることです。

あなたは元の配列が戻っConvert.FromBase64Stringを使用することです取得方法:

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

働いた、base64では、すべての8ビットのうち、わずか6を使用している場合が、私はエンコードが短くなると思うだろうか? – crawfish

+6

@crawfishエンコーディングは、出力で8ビットのうち6ビットを使用し、2つの最も重要なビットをゼロに設定したままにします。その結果、3バイト(3 * 8 = 24ビット)のグループはすべて4バイトのグループ(4 * 6 = 24ビット)になります。元のバイト数が3で割り切れない場合は、最後に特別なマーカーが追加されます。あなたの場合、32より大きい3で割り切れる次の数字は33、つまり「11 * 3」です。これは、結果が「11 * 4」つまり44バイト長であることを意味します。 – dasblinkenlight

+0

説明のためにありがとう – crawfish

関連する問題