- 使用更多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()
答案 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)