Encoding.GetString () возвращает только первый байт из массива байтов - PullRequest
2 голосов
/ 17 июня 2019

Пример, я хочу преобразовать 3 байта в преобразование ASCII

int a = random.Next(0, 100);
int b = random.Next(0, 1000);
int c = random.Next(0, 30);

byte[] byte1 = BitConverter.GetBytes(a);
byte[] byte2 = BitConverter.GetBytes(b);
byte[] byte3 = BitConverter.GetBytes(c);

byte[] bytes = byte1.Concat(byte2).Concat(byte3).ToArray();
string asciiString = Encoding.ASCII.GetString(bytes, 0, bytes.Length);
label1.Text = asciiString;

Показывает только байт1 вместо всех байтов.

1 Ответ

5 голосов
/ 17 июня 2019

Если вы посмотрите в отладчике на переменную asciiString, вы увидите, что все 3 буквы есть, но между ними у вас всегда есть 0x00 символ.

(скриншот из дампа LINQPad)

enter image description here

К сожалению, это интерпретируется как конец строки . Вот почему вы видите только первый байт / букву.

Документация GetBytes (char) гласит, что возвращается:

Массив байтов длиной 2.

если вы теперь получаете байты от одного символа:

byte[] byte1 = BitConverter.GetBytes('a');

Вы получите следующий результат:

enter image description here

Решением будет выбор только тех байтов, которые не 0x00:

bytes = bytes.Where(x => x != 0x00).ToArray();

string asciiString = Encoding.ASCII.GetString(bytes, 0, bytes.Length);
label1.Text = asciiString;

Этот пример основан на варианте Char GetBytes. Но это верно для всех других перегрузок этого метода. Все они возвращают массив, который может содержать максимальное значение соответствующего типа данных. Так что это будет происходить всегда, если значение настолько мало, что последний байт в массиве не используется и заканчивается равным 0!

...