2008-12-05 3 views
1

--edit с более BGND information--Преобразование строки из MemoryStream в двоичную [] содержит ведущих дерьмо

A (черный ящик) COM объект возвращает мне строку. Второй COM-объект ожидает такую ​​же строку, что и в качестве байта [], и возвращает байт [] с обработанными данными. Это будет загружаться в браузер как загружаемый, нечитаемый для человека файл, который будет загружен в автономное приложение на стороне клиента.

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

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

я кормить его 2-й COM и читать его обратно. Результат записывается в браузер.

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

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

В нечитаемые символы такого рода:

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

Любые идеи?

--Answer--
Использование

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

, а затем

BinaryFormatter.Serialize() 
+0

Когда вы говорите «это дерьмо», «это» ссылается на что-либо в вашем посте или вы говорите, что есть что-то еще, но вы не можете вставить его или описать? – 2008-12-05 10:47:21

+0

D'oh. Некоторые комментарии - это не что иное, как вежливое ;-) – 2008-12-05 10:50:58

+0

Если это самое худшее (слово), с которым вы сталкиваетесь в своей жизни, вам не о чем беспокоиться;) – 2008-12-05 10:53:32

ответ

1

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

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

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

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

1

Я думаю, что вам не хватает точки BinarySerialization.

Для начала, какой тип является формулойXml?

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

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

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

Update:

Вы хотите, чтобы написать некоторый XML как поток 'контента диспозиции'.

Чтобы сделать это, сделать что-то вроде:

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

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

2

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

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

1

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

(Просто о упомянуть Encoding.GetBytes как хорошо, но Джон опередил меня.)

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

Смежные вопросы