在带有MemoryStream的xml末尾有很多意想不到的"nul"字符

Sha*_*pac 5 c# asp.net-mvc memorystream linq-to-xml filecontentresult

我为用户编写了一个动作,用于下载生成的xml,而不必将其写入服务器磁盘,但将其保存到内存中.

这是我的代码:

public FileContentResult MyAction()
{
  MemoryStream myStream = new MemoryStream();
  XDocument xml = GenerateXml(...);
  xml.Save(myStream );
  myStream .Position = 0;
  return File(myStream.GetBuffer(), "text/xml", "myFile.xml");
}
Run Code Online (Sandbox Code Playgroud)

一切似乎工作正常,XML是正确的,我可以下载文件,但我不明白为什么我的文件末尾有691920"nul"caracters(这些caracters的数量似乎与长度有关)的xml):

在此输入图像描述

它们来自哪里?我怎么能摆脱它们?

[更新]我试过这个:

public FileContentResult MyAction()
{
  XDocument xml = GenerateXml(...);
  byte[] bytes = new byte[xml.ToString().Length * sizeof(char)];
  Buffer.BlockCopy(xml.ToString().ToCharArray(), 0, bytes, 0, bytes.Length);
  return File(bytes, "text/xml", "myFile.xml");
}
Run Code Online (Sandbox Code Playgroud)

我没有得到"nul"角色.所以我想这是MemoryStream在文件末尾添加额外的caracters.所以在我的例子中,第二个代码解决了我的问题.

但我也生成了一个我无法阅读的Word文档(由于内容存在问题,因此无法打开xxx.docx).我想我在这里遇到同样的问题,内存流在文件末尾添加额外的caracters并破坏它.

Jon*_*eet 11

问题是你正在打电话myStream.GetBuffer().该GetBuffer()方法返回由其使用的基础数组MemoryStream,包括不包含实际数据的任何"备用"部分.从文档:

请注意,缓冲区包含可能未使用的已分配字节.例如,如果将字符串"test"写入MemoryStream对象,则从GetBuffer返回的缓冲区长度为256而不是4,未使用252个字节.要仅获取缓冲区中的数据,请使用ToArray方法; 但是,ToArray会在内存中创建数据副本.

而不是使用GetBuffer(),ToArray()或使用- 或使用流的长度来知道实际使用多少缓冲区.

请注意,在您更新的代码中,您基本上将字符串转换为UTF-16 - 这可能意味着它需要的大小是它的两倍,并且它也可能不遵循它声称的编码.我不建议采用这种方法.