gpt4 book ai didi

c# - 使用 MemoryStream 的 xml 末尾有很多意外的 "nul"字符

转载 作者:太空狗 更新时间:2023-10-29 22:23:00 25 4
gpt4 key购买 nike

我为用户编写了一个操作来下载生成的 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");
}

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

enter image description here

他们从哪里来?我怎样才能摆脱它们?

[更新]我试过这个:

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");
}

而且我没有得到“nul”字符。所以我想是 MemoryStream 在文件末尾添加了额外的字符。所以在我的示例中,第二个代码解决了我的问题。

但是我也生成了一个Word文档,看不懂(xxx.docx打不开,因为内容有问题)。我想我在这里遇到了同样的问题,内存流在文件末尾添加了额外的字符并损坏了它。

最佳答案

问题是您正在调用 myStream.GetBuffer()GetBuffer()方法返回MemoryStream 使用的底层 数组,包括不包含实际数据的任何“备用”部分。来自文档:

Note that the buffer contains allocated bytes which might be unused. For example, if the string "test" is written into the MemoryStream object, the length of the buffer returned from GetBuffer is 256, not 4, with 252 bytes unused. To obtain only the data in the buffer, use the ToArray method; however, ToArray creates a copy of the data in memory.

不使用 GetBuffer(),而是使用 ToArray() - 或者使用流的长度来了解实际使用多少缓冲区。

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

关于c# - 使用 MemoryStream 的 xml 末尾有很多意外的 "nul"字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16086165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com