Затем, когда вам нужно вызвать байтовую версию, вы можете сделать следующее:
ET) У меня есть произвольные двоичные данные, хранящиеся вбайт[] (изображение, например). Теперь мне нужно сохранить эти данные встрока (поле «Комментарий» устаревшего API). Есть ли стандартная техника дляупаковка эти двоичные данные встрока? Под «упаковкой» я подразумеваю, что для любого достаточно большого и случайного набора данныхbytes.Length / 2 примерно так же, какpacked.Length; потому что два байта более или менее один символ.
Два «очевидных» ответа не соответствуют всем критериям:
string base64 = System.Convert.ToBase64String(bytes)
не очень эффективно используетстрока поскольку он использует только 64 символа из примерно 60 000 доступных (мое хранилищеSystem.String). Идти с
string utf16 = System.Text.Encoding.Unicode.GetString(bytes)
лучше использоватьстрока, но это не будет работать для данных, которые содержат недопустимые символы Unicode (скажем, несовпадающие суррогатные пары).Эта статья MSDN показывает эту точную (плохую) технику.
Давайте посмотрим на простой пример:
byte[] bytes = new byte[] { 0x41, 0x00, 0x31, 0x00};
string utf16 = System.Text.Encoding.Unicode.GetString(bytes);
byte[] utf16_bytes = System.Text.Encoding.Unicode.GetBytes(utf16);
В этом случаебайтов а такжеutf16_bytes одинаковы, потому что оригиналбайтов были строки UTF-16. Выполнение этой же процедуры с кодировкой base64 дает 16 членовbase64_bytes массив.
Теперь повторите процедуру с неверными данными UTF-16:
byte[] bytes = new byte[] { 0x41, 0x00, 0x00, 0xD8};
Вы найдете этоutf16_bytes не совпадают с исходными данными.
Я написал код, который использует U + FFFD как escape перед недопустимыми символами Unicode; это работает, но я хотел бы знать, есть ли более стандартная техника, чем то, что я только что приготовил самостоятельно. Не говоря уже о том, что я не люблюловитьвDecoderFallbackException как способ обнаружения недопустимых символов.
Я думаю, вы могли бы назвать это «базовая кодировка BMP» или «базовая UTF-16» (используя все символы в базовой многоязычной плоскости Unicode). Да, в идеале я бы следовалСовет Шона Стила и пройтибайт[].
Я собираюсь согласиться с предложением Питера Хауса в качестве «правильного» ответа, потому что он единственный, кто приблизился к предложению «стандартной техники».
редактироватьbase16k выглядит даже лучше. Джим Беверидж имеетреализация.