Какова наилучшая последовательность для сжатия двоичных данных, кодирования и преобразования в строку? - PullRequest
0 голосов
/ 16 сентября 2010

Я пытаюсь сохранить сжатый двоичный сериализованный объект в «Атрибут расширения Active Directory», дополнительная информация здесь .Это поле является строкой Unicode в соответствии с oM синтаксисом из 64.

Я сохраняю двоичный объект в формате Unicode AD, как это:

byte[] bytes = ... // This is my blob 
System.Text.Encoding.Unicode.GetString(bytes); 

Iзатем сохраните его в атрибуте расширения # 14.Проблема в том, что когда я читаю значение, я не получаю всю свою строку обратно.

Вот скриншот того, что на самом деле сохраняется на сервере: alt text

Вотскриншот того, что возвращается: alt text

Я предполагаю, что \ 0 вызывает проблему, и это, вероятно, означает ноль.Как мне справиться с этим?Есть ли другие символы, с которыми мне следует сбежать, кроме нуля?

1 Ответ

2 голосов
/ 16 сентября 2010

Я предполагаю, что вы пытаетесь поместить двоичные данные в строковое поле.

Простое преобразование данных из двоичного файла в Unicode является несколько плохой идеей (одна из причин, по которой вы столкнулись, но Null (0) - не единственная точка в строковом кодировании Unicode, которая может вызвать проблемы для вас . Существуют и другие управляющие символы, у вас могут быть пары байтов, которые указывают на символы, зарезервированные в Unicode и т. Д.)

Я бы рекомендовал вместо этого использовать Base64. Он был разработан именно для этой цели. Хотя это, вероятно, затрудняет ваши усилия по сжатию с помощью gzip, это должно решить вашу проблему.

Вместо этого ваш код будет выглядеть примерно так:

byte[] bytes = ... // This is my blob 
System.Convert.ToBase64String(bytes); 

Затем вы используете:

System.Convert.ToBase64String(string); 

Чтобы вернуть ваши данные в байтах.

Это определенно более безопасный подход, чем то, что вы делаете.

...