C# 为什么我的文件在上传并转换成字节数组后大小不同?
我使用以下代码从HttpPostedFileBase对象中获取字节数组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,
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
。