2016-12-29 25 views
1

私はバイトサイズの配列がどのように文字列よりも小さいか理解しようとしています。私は文字列の各文字が2バイトのようなものであることを知っています。しかし、その数学は合わない。誰かが私のためにいくつかの光を発することができますか?バイト配列のサイズが文字列サイズと等しくないのはなぜですか?

byte[] myBytes = Encoding.ASCII.GetBytes("12345"); 
string myString = Convert.ToBase64String(myBytes); 
Debug.WriteLine("Size of byte array: " + myBytes.Length); 
Debug.WriteLine("Size of string: " + myString.Length); 

戻り値:バイト配列の

サイズ:文字列の5

サイズ:8

+1

結果のB64文字列を見てください - それは8文字になります – Plutonix

+0

@Plutonix正しいことは 'MTIzNDU ='になります。しかし、それは問題です、私はスクリプトが 'MTIzNDU ='ではなく '12345'であると期待しています。それが私の混乱の原因です。 –

+1

違うようにエンコードすると、同じままになるのはなぜですか? Base64!= ASCII – Plutonix

答えて

9

サイズ/長さが一致します、 1:1エンコーディングを使用する場合に限ります。

まず、エンコードとは少し混乱しているようです。バイトは数字(0〜127の範囲)で、のコンピュータでのみ保存可能なものです。これらの数字は、数値以外の人間には何もありません。というテキストのアイデアを保存できるようにするために、これらの数字を読みやすい(読みにくい)文字にマップする方法を考え出す必要がありました。これらのメソッドは、エンコーディングと呼ばれます。

オーバーヘッド(Base64 length calculation?に従った入力の3バイトあたり約1の追加バイト)を持つBase64エンコーディングでバイトをエンコードしました。そのオーバーヘッドがあなたの違いを引き起こしています。

あなたの代わりにを使用した場合:

byte[] myBytes = Encoding.ASCII.GetBytes("12345"); 
string myString = Encoding.ASCII.GetString(myBytes); 
Console.WriteLine("Size of byte array: " + myBytes.Length); 
Console.WriteLine("Size of string: " + myString.Length); 

を期待通りにあなたが得る:バイト配列の

サイズ:文字列の5

サイズ:5

をBase64を使用する理由は(オーバーヘッドであっても)e ncode バイトの配列を印刷可能な文字(URLを使って送信しようとすると必要です)に変換しますが、ASCIIの場合はかなりの数の文字が出力されます。

また、文字はUTF-16エンコーディングで2バイトしかないことに注意してください。なぜなら、あなたの質問で言及したように、あなたの数字が2倍ではないからです。

+0

エンコードの説明もありがとう! –

関連する問題