2016-12-29 3 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 ='. Но в этом проблема, я ожидаю, что скрипт будет '12345' не' MTIzNDU = '. Вот где моя путаница. –

+1

Зачем это оставаться неизменным, если вы кодируете его по-другому? Base64! = ASCII – Plutonix

ответ

9

размеров/длины совпадают, но только если вы используете кодировку 1: 1.

Во-первых, вы, кажется, немного смущены относительно того, что такое кодировка. Помните, что байты - это просто цифры (диапазон 0-127) и только вещь, сохраняемая компьютером. Эти цифры не означают что-либо для людей, кроме числового значения. Поскольку мы хотели иметь возможность хранить идею текст, нам пришлось придумать способ сопоставить эти числа с читаемыми (и некоторыми не очень читаемыми) символами. Эти методы называются encodings.

Вы кодировали свои байты с кодировкой Base64, которая имеет накладные расходы (приблизительно 1 дополнительный байт на 3 байта ввода в соответствии с Base64 length calculation?). Эти накладные расходы вызывают разницу.

Если вы использовали вместо:

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 (даже с накладными расходами) заключается в том, что он может ncode любой массив байтов в печатные символы (который требуется при попытке отправить их через URL), тогда как кодировка ASCII приведет к непечатаемым символам для нескольких значений.

Также обратите внимание, что символ имеет только два байта в кодировке UTF-16, поэтому ваш номер не удваивается, как вы упомянули в вопросе.

+0

Спасибо за объяснение кодировки! –

Смежные вопросы