#c_sharp
Имею код: byte[] one = new byte[] {215, 170, 8, 223, 101, 20, 107, 124}; byte[] two = Encoding.Unicode.GetBytes(Encoding.Unicode.GetString(one)); foreach (var el in two) Console.Write(el + " "); На выходе: 215 170 253 255 101 20 107 124 Как видно, третий и четвёртый байты не совпадают. Баг или фича?
Ответы
Ответ 1
Это фича. С настройками по умолчанию UnicodeEncoding не проверяет входящие байты на валидность. Т.е. строку вы получаете, но т.к. на входе могли быть байты, не имеющие валидного отображения в строку, то в строке на этой позиции будет 0xFDFF (253, 255). На самом деле поведение при встрече невалидного символа зависит от Encoding, и его можно заменить на кастомный. Для Unicode, это Replacement Fallback. Если нужны подробности - посмотрите MSDN, Character Encoding in .NET, Replacement Fallback. Если хотите получать ошибку, а не "невалидный символ" - укажите throwOnInvalidBytes при создании кодировки: var encoding = new UnicodeEncoding(false, false, throwOnInvalidBytes: false); encoding.GetString(new byte[] { 215, 170, 8, 223, 101, 20, 107, 124}); // бросит исключение
Комментариев нет:
Отправить комментарий