Если вы пытаетесь сохранить произвольные непрозрачные двоичные данные, которые не действительно текст, в поле NVARCHAR, вы должны использовать кодировку base64 для их кодирования. Попытка просто трактовать это как кодировку текста в UTF-16 (что вы и делаете здесь) - в корне плохая идея, и очень вероятно, что вы потеряете данные. В качестве одного примера того, где это может произойти, вы можете получить строку, содержащую половину суррогатной пары без другой половины.
Я предполагаю, что ваши "зашифрованные данные" были сохранены путем простого вызова Encoding.Unicode.GetString(bytes)
, где bytes
- это зашифрованные данные? Если так, то это определенно не тот путь. Использование:
string text = Convert.ToBase64String(bytes);
вместо этого, а при получении данных используйте
byte[] bytes = Convert.FromBase64String(text);
В качестве альтернативы используйте поле базы данных, в первую очередь предназначенное для двоичных данных.
РЕДАКТИРОВАТЬ: (скопировано из моего комментария) Пример, который вы привели, в конце терпит неудачу, преобразуя U + DDF0 в U + FFFD. На самом деле это именно тот сценарий, который я упомянул выше - U + DDF0 является «низким суррогатом», но у него нет соответствующего «высокого суррогата», поэтому Encoding.GetString преобразует этот символ в U + FFFD, который является «заменой». символ ", который (из таблицы Unicode )
используется для замены входящего символа, значение которого неизвестно или непредставимо в Юникоде
IIRC, вы можете указать, что Encoding
делает, когда он сталкивается с неверными двоичными данными (что, по сути, то, что вы даете), и, возможно, заставить его генерировать исключение.