1

--编辑更多bgnd信息--

一个(黑盒)COM 对象返回一个字符串。第二个 COM 对象需要与 byte[] 相同的字符串作为输入,并返回带有处理数据的 byte[]。这将作为可下载的非人类可读文件提供给浏览器,该文件将加载到客户端独立应用程序中。

所以我从第一个 COM 获取字符串 inputString 并将其转换为 byte[] 如下

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

我将它提供给第二个 COM 并将其读回。结果被写入浏览器。

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

由于格式不正确,错误发生在第 2 个 COM 中。我去检查了原始字符串,这非常好。然后我将结果从 1st com 直接发送到浏览器并观察结果。似乎在路上的某个地方添加了额外的不可读字符。这些字符是什么,它们的用途是什么?如何防止它们使我的第二个 COM 停止运行?

不可读的字符是这样的:

NUL/SOH/NUL/NUL/NUL/FF/FF/FF/FF/SOH/NUL/NUL/NUL 等

有任何想法吗?

--答案--
使用

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

而不是

BinaryFormatter.Serialize()
4

5 回答 5

2

BinaryFormatter 几乎肯定不是您想要使用的。

如果您只需要将字符串转换为字节,当然可以使用Encoding.GetBytes进行合适的编码。UTF-8 通常是正确的,但请检查文档是否指定了编码。

于 2008-12-05T10:58:05.277 回答
1

我认为您错过了 BinarySerialization 的重点。

首先,formulaXml 是什么类型?

二进制序列化会将其压缩为机器表示的值,而不是 XML!内容将如下所示:

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

也许您应该改用 XML 序列化程序。

更新:

您想将一些 XML 写为“内容处置”流。

为此,请执行以下操作:

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

这应该像你希望的那样工作(我认为)。

于 2008-12-05T10:52:01.467 回答
1

BinaryFormatter工作是将对象转换为某种不透明的序列化格式,只能由另一BinaryFormatter端的另一个人理解。

(我也想提一下Encoding.GetBytes,但乔恩打败了我。)

您可能想要使用 System.Text.Encoding.UTF8.GetBytes()。

于 2008-12-05T11:00:26.457 回答
1

好的,使用您更新的信息:您的第二个 COM 对象需要二进制数据,但您想从字符串创建该二进制数据。它是否将其视为纯二进制数据?

我的猜测是,在客户端会有一些事情会逆转这个过程。如果最终要将数据重建为字符串,则需要选择要使用的正确编码,并在两边都使用它。在大多数情况下,UTF-8 是一个不错的选择,但如果客户端只是将数据写入文件并将其用作 XML 文件,则需要根据 XML 选择适当的编码。

您之前说过字符串的前几个字符只是"<foo>"(或类似的)——这是否意味着没有 XML 声明?如果不是,请选择 UTF-8。否则,您应该查看 XML 声明并使用它来确定您的编码(如果声明未指定编码,则再次默认为 UTF-8)。

获得正确的编码后,请使用前面答案中提到的 Encoding.GetBytes 。

于 2008-12-05T11:22:17.663 回答
0

开头的废话是两个字节长吗?

这可能是 Unicode 编码字符串的字节顺序标记。

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

于 2008-12-05T10:52:24.743 回答