Вы не можете преобразовать двоичные данные в строку напрямую.Символы Unicode в строке кодируются с использованием utf16 в .NET.Эта кодировка использует два байта на символ, обеспечивая 65536 различных значений.Юникод, однако, имеет более миллиона кодовых точек.Чтобы это работало, кодовые точки Unicode над \ uffff (над BMP, Basic Multilingual Plane) кодируются суррогатной парой.Первый из них имеет значение между 0xd800 и 0xdffff, второй между 0xdc00 и 0xdfff.Это дает 2 ^ (10 + 10) = 1 миллион дополнительных кодов.
Возможно, вы увидите, к чему это приведет, в вашем случае код обнаруживает высокое суррогатное значение (0xdfff), которое не сопряжено с низкимсуррогат.Это незаконно.Множество возможных неудач, несколько кодовых точек не назначены, некоторые - диакритические знаки, которые искажаются, когда строка нормализуется.
Вы просто не можете заставить эту работу работать.Кодировка Base64 - это стандартный способ переноса двоичных данных в текстовый поток.Он использует 6 бит на символ, 3 байта требуют 4 символа.Набор символов ASCII, поэтому шансы принимающей программы, неправильно декодирующей символ обратно в двоичный, минимальны.Только десятилетний мэйнфрейм IBM, использующий EBCDIC, может доставить вам неприятности.Или просто избегайте кодирования текста и сохраняйте его двоичным.