Если вы посмотрите в отладчике на переменную asciiString
, вы увидите, что все 3 буквы есть, но между ними у вас всегда есть 0x00
символ.
(скриншот из дампа LINQPad)
К сожалению, это интерпретируется как конец строки . Вот почему вы видите только первый байт / букву.
Документация GetBytes (char) гласит, что возвращается:
Массив байтов длиной 2.
если вы теперь получаете байты от одного символа:
byte[] byte1 = BitConverter.GetBytes('a');
Вы получите следующий результат:
Решением будет выбор только тех байтов, которые не 0x00
:
bytes = bytes.Where(x => x != 0x00).ToArray();
string asciiString = Encoding.ASCII.GetString(bytes, 0, bytes.Length);
label1.Text = asciiString;
Этот пример основан на варианте Char GetBytes. Но это верно для всех других перегрузок этого метода. Все они возвращают массив, который может содержать максимальное значение соответствующего типа данных. Так что это будет происходить всегда, если значение настолько мало, что последний байт в массиве не используется и заканчивается равным 0!