C# 为什么我的文件在上传并转换成字节数组后大小不同?

C# 为什么我的文件在上传并转换成字节数组后大小不同?,c#,.net,asp.net-mvc-3,bytearray,memorystream,C#,.net,Asp.net Mvc 3,Bytearray,Memorystream,我使用以下代码从HttpPostedFileBase对象中获取字节数组 byte[] mobileAppByteArray = default(byte[]); using (MemoryStream ms = new MemoryStream()) { httpPostedFileObject.InputStream.CopyTo(ms); mobileAppByteArray = ms.GetBuffer(); } httpPostedFileObject的原始大小为3191KB,

我使用以下代码从HttpPostedFileBase对象中获取字节数组

byte[] mobileAppByteArray = default(byte[]);
using (MemoryStream ms = new MemoryStream())
{
  httpPostedFileObject.InputStream.CopyTo(ms);
  mobileAppByteArray = ms.GetBuffer();
}
httpPostedFileObject的原始大小为3191KB,但经过上述转换并保存到磁盘后,文件大小为4096KB

我知道
CopyTo
的默认缓冲区大小是4096,但即使我将缓冲区大小更改为1024,结果也是一样的:文件大小是4096KB

如何更改代码,使文件在保存到磁盘后保持3191KB?

这是因为它将返回整个底层缓冲区,而不仅仅是输入流中已填充字节的部分。请尝试使用以下方法:

mobileAppByteArray = ms.ToArray();

太好了,谢谢!还有一件事:链接的文档似乎有一个关于ToArray的警告
,但是ToArray会在内存中创建数据的副本。
这是问题吗?有没有办法解决这个问题?GetBuffer获取对不存在的缓冲区的引用,那么有没有方法获取对缓冲区“已使用”部分的引用?@theTableDone实际上没有
CopyTo
将只复制数组中已使用的部分,并且
Length
属性将告诉您使用了多少数组,但在这两种情况下,您可能需要更改使用内存流的方式。如果您想要得到一个只表示缓冲区已使用部分的数组,那么就可以使用
ToArray