Преобразование строки из потока памяти в двоичный файл [] содержит начальную хрень - PullRequest
1 голос
/ 05 декабря 2008

- редактировать с более подробной информацией -

A (черный ящик) COM-объект возвращает мне строку. 2-й COM-объект ожидает эту же строку как byte [] в качестве ввода и возвращает byte [] с обработанными данными. Он будет передан в браузер в виде загружаемого файла, не читаемого человеком, который будет загружен в автономное приложение на стороне клиента.

поэтому я получаю строку inputString из 1-го COM и преобразую ее в байт [] следующим образом

BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, inputString);
obj = ms.ToArray();

Я передаю его второму СОМ и зачитываю обратно. Результат записывается в браузер.

Response.ContentType = "application/octet-stream";
Response.AddHeader("content-disposition", "attachment; filename="test.dat");
Response.BinaryWrite(obj);

Ошибка возникает во 2-м COM, потому что форматирование неверно. Я пошел, чтобы проверить оригинальную строку, и это было прекрасно. Затем я закачал результат с первого ком непосредственно в браузер и посмотрел, что получилось. Оказалось, что где-то вдоль дороги добавляются дополнительные нечитаемые символы. Что это за персонажи, для чего они используются, и как я могу помешать им заставить мой 2-й СМР остановиться на месте?

Нечитаемые символы такого типа:

NUL / SOH / NUL / NUL / NUL / FF / FF / FF / FF / FF / SOH / NUL / NUL / NUL и т.д.

Есть идеи?

- Ответ -
Используйте

System.Text.Encoding.UTF8.GetBytes(theString)

а не

BinaryFormatter.Serialize()

Ответы [ 5 ]

2 голосов
/ 05 декабря 2008

BinaryFormatter почти наверняка не то, что вы хотите использовать.

Если вам просто нужно преобразовать строку в байты, конечно, используйте Encoding.GetBytes для подходящей кодировки. UTF-8 обычно корректен, но проверьте, указана ли в документе кодировка.

1 голос
/ 05 декабря 2008

Хорошо, с вашей обновленной информацией: ваш второй COM-объект ожидает двоичные данные, но вы хотите создать эти двоичные данные из строки. Это обрабатывает это как простые двоичные данные?

Я предполагаю, что что-то изменит этот процесс на стороне клиента. Если в конечном итоге потребуется восстановить данные в виде строки, вам необходимо выбрать правильную кодировку и использовать ее с обеих сторон. UTF-8 в большинстве случаев является хорошей ставкой, но , если на стороне клиента просто собирается записать данные в файл и использовать его как файл XML, вам нужно выбрать подходящую кодировку на основе XML.

Вы говорили ранее, что первые несколько символов строки были просто "<foo>" (или что-то похожее) - значит ли это, что нет декларации XML? Если нет, выберите UTF-8. В противном случае вы должны просмотреть декларацию XML и использовать ее для определения своей кодировки (снова по умолчанию UTF-8, если в объявлении не указана кодировка).

Как только вы получите правильную кодировку, используйте Encoding.GetBytes, как упоминалось в предыдущих ответах.

1 голос
/ 05 декабря 2008

Работа BinaryFormatter заключается в преобразовании объектов в какой-то непрозрачный формат сериализации, который может быть понят только другому BinaryFormatter на другом конце.

(Я тоже собираюсь упомянуть Encoding.GetBytes, но Джон опередил меня.)

Возможно, вы захотите использовать System.Text.Encoding.UTF8.GetBytes ().

1 голос
/ 05 декабря 2008

Я думаю, что вы упускаете точку BinarySerialization.

Для начала, какой тип - Formula XML?

Двоичная сериализация сжимает это в машинное значение, а не XML! Контент будет выглядеть так:

    ÿÿÿÿ          AIronScheme, Version=1.0.0.0, Culture=neutral, Public

Возможно, вам стоит взглянуть на XML-сериализатор.

Обновление:

Вы хотите записать какой-нибудь XML-файл в виде потока «размещения содержимого».

Для этого сделайте что-то вроде:

byte[] buffer = Encoding.Default.GetBytes(formulaXml);
Response.BinaryWrite(buffer);

Это должно сработать так, как вы надеялись (я думаю).

0 голосов
/ 05 декабря 2008

Дерьмо в начале два байта?

Это может быть метка порядка байтов в кодировке Unicode.

http://en.wikipedia.org/wiki/Byte-order_mark

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...