将字符串从memorystream转换为binary []包含主要废话

时间:2008-12-05 10:42:46

标签: c# stream

- 使用更多bgnd信息进行编辑 -

A(黑盒子)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);

第二个COm发生错误,因为格式不正确。 我去检查原始字符串,这非常好。然后我将第一个com的结果直接输出到浏览器,看看是什么出来的。似乎在路上的某个地方添加了额外不可读的字符。这些角色是什么,它们用于什么,以及如何防止它们使我的第二个COM陷入停顿?

不可读的角色属于这种类型:

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

有什么想法吗?

- 应答 -
使用

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

而不是

BinaryFormatter.Serialize()

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我认为你错过了BinarySerialization的观点。

对于初学者来说,什么类型是formulaXml?

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

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

也许您应该改为查看XML序列化程序。

<强>更新

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

要做到这一点,请执行以下操作:

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

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

答案 2 :(得分:1)

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

(即将提及Encoding.GetBytes,但Jon打败了我。)

您可能希望使用System.Text.Encoding.UTF8.GetBytes()。

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:0)

开头的垃圾是两个字节长吗?

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

  

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