Имею код:
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
Как видно, третий и четвёртый байты не совпадают. Баг или фича?
Это фича. С настройками по умолчанию 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}); // бросит исключение
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Я хочу реализовать простенький скриптСмысл его заключается в том, чтобы когда вылезает окно с ошибкой на каком-либо сайте моя программа искала...
Проблема очень простаяСоздал вспомогательный метод в отдельном классе