Затем, когда вам нужно вызвать байтовую версию, вы можете сделать следующее:

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 выглядит даже лучше. Джим Беверидж имеетреализация.

Ответы на вопрос(7)

Ваш ответ на вопрос