2017-02-11 7 views
-4

ゼロから昇順のベース64桁は、大文字の「A」〜「Z」、小文字の「a」〜「z」、 の数字「0」〜「9」、記号「+」および「/」を含む。無価値の 文字 "="は、末尾のパディングに使用されます。Convert.ToBase64String()はどのように機能しますか?

したがって、次のバイト配列はConvert.ToBase64String()でどのように変換されますか?特に元のバイト配列は10要素を持ち、変換された文字列は16文字あるのはなぜですか?

using System; 

public class Example 
{ 
    public static void Main() 
    { 
     // Define a byte array. 
     byte[] bytes = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 }; 
     Console.WriteLine("The byte array: "); 
     Console.WriteLine(" {0}\n", BitConverter.ToString(bytes)); 

     // Convert the array to a base 64 sring. 
     String s = Convert.ToBase64String(bytes); 
     Console.WriteLine("The base 64 string:\n {0}\n", s); 

     // Restore the byte array. 
     byte[] newBytes = Convert.FromBase64String(s); 
     Console.WriteLine("The restored byte array: "); 
     Console.WriteLine(" {0}\n", BitConverter.ToString(newBytes)); 
    } 
} 
// The example displays the following output: 
//  The byte array: 
//  02-04-06-08-0A-0C-0E-10-12-14 
//  
//  The base 64 string: 
//  AgQGCAoMDhASFA== 
//  
//  The restored byte array: 
//  02-04-06-08-0A-0C-0E-10-12-14 
+2

あなたは[what base64 is](https://en.wikipedia.org/wiki/Base64)を読むことができます。これは、Base64エンコーディングタイプに関するこの質問やその他の質問に答える必要があります。 – Abion47

+0

私は現在の状態でこの記事のために見ることができる唯一の答えは "Convert.ToBase64Stringは正しく動作します"です。あなたは、あなたが何を期待しているか、あなたが理解していないこと、そしてhttps://referencesource.microsoft.com/#mscorlib/system/convert.cs,37f71bcd2a713cd5のどの部分が不明であるかを明確にしてください。 –

+0

Wikiの回答は@ Abion47と書いてありますが、非常に明確で精巧です。もっと具体的な質問があればお気軽にお問い合わせください。 –

答えて

0

ベース64 - ASCIIとは異なり、64個の読みやすい文字(文字など)を提供します。 64ビットしかないので、8ビットではなく6ビットでしか動作しません。基本的に3バイトごとに4つの6ビットセグメントに分割され、それぞれがBase64文字になります。したがって、9バイトには12のBase64文字が必要です.10バイト目には2が必要です。 これで14文字になりました。この処理を元に戻すには、文字数を4で割り切れるようにするため、14文字に=を埋め込んで16文字にします。

4

ほとんどのプログラマーは、16進符号化に精通しています。これは、セット[0..9、A..F]からのシンボルを使用してBase16エンコーディングです。それは1シンボルにつき4ビットを符号化し、1バイト毎に符号化するには2シンボルを必要とする。例えば、123のバイト値は "7B"として符号化される。そして誰もがバイナリエンコーディングを知っています。これは、セットのシンボルを持つBase2エンコーディングです[0..1]。 "01111011"を生成します。 Baudot(Base32)とOctal(Base8)は、使用できなくなったレガシーエンコードです。

便利で驚異的ですが、これらのエンコードはかなり無駄です。大きなシンボルセットを使用すると、より良い結果が得られます。シンボルはユニークで、あるマシンから別のマシンに移動するときに誤解される可能性は低いという要件があります。これにより、Base64は、ASCII文字セットからシンボルを選択する際の実用的な選択になります。これには、128〜32 = 96の可能なシンボルがあり、これは制御コードではなく、Base128に移動するのに十分ではありません。

各シンボルは現在6ビットをエンコードしており、16進エンコードよりも50%優れています。あなたの配列は10 x 8 = 80ビットでエンコードします。したがって、配列をエンコードするにはceil(80/6)= 14シンボルが必要です。シンボルのBase64文字列の追加の要件は、その長さが4の倍数である必要があることです。これにより、デコーダの生活が容易になります。それは、パディング文字として=シンボルを使用して、文字列の長さを4 * trunc(len/4 + 3)= 16文字に上げます。

奇妙なアヒルとしてBase4を去ります。まあ、すべての人がシンボルセット[TCGA]から数十億を持って、あなたのDNAを作ります:)

関連する問題