C# 修改的Memorystream字节长度小于其保存时的长度

C# 修改的Memorystream字节长度小于其保存时的长度,c#,.net,file,io,stream,C#,.net,File,Io,Stream,我将二进制文件加载到内存流中,修改字节,然后将文件存储到磁盘。但是为了节省时间,我保留了修改后的字节数组来计算校验和。当我从磁盘加载保存的文件并计算校验和时,文件长度与保存时的原始字节长度相差约150字节,显然校验和与保存前的校验和不匹配。你知道为什么会这样吗?我一直在搜索线索,但看起来我必须在保存文件后重新加载该文件才能计算准确的校验和 还请注意,较短的字节数组确实正确地呈现其内容,较长的字节数组也是如此,事实上,两个数组呈现相同 下面是从内存流收集修改的字节的代码: writerStream

我将二进制文件加载到内存流中,修改字节,然后将文件存储到磁盘。但是为了节省时间,我保留了修改后的字节数组来计算校验和。当我从磁盘加载保存的文件并计算校验和时,文件长度与保存时的原始字节长度相差约150字节,显然校验和与保存前的校验和不匹配。你知道为什么会这样吗?我一直在搜索线索,但看起来我必须在保存文件后重新加载该文件才能计算准确的校验和

还请注意,较短的字节数组确实正确地呈现其内容,较长的字节数组也是如此,事实上,两个数组呈现相同

下面是从内存流收集修改的字节的代码:

writerStream.Flush();
storedFile = new Byte[writerStream.Length];
writerStream.Position = 0;
writerStream.Read(storedFile, 0, Convert.ToInt32(writerStream.Length));
下面是我如何读取文件的:

using (BinaryReader readFile = new BinaryReader(Delimon.Win32.IO.File.Open(filePath, Delimon.Win32.IO.FileMode.Open)))
        {
            byte[] cgmBytes = readFile.ReadBytes(Convert.ToInt32(readFile.BaseStream.Length));
            hash = fileCheck.ComputeHash(cgmBytes);                
        }
以下是文件的保存方式:

     (using BinaryWriter aWriter = new BinaryWriter(Delimon.Win32.IO.File.Create(filePath))
     {

          aWriter.Write(storedFile);

     } 
如有任何建议,将不胜感激


Thx

通过简单地更改流位置设置点,问题似乎已经自行解决:

                writerStream.Flush();
                writerStream.Position = 0; 
                storedFile = new Byte[writerStream.Length];
                writerStream.Read(storedFile, 0, Convert.ToInt32(writerStream.Length));

在前面的代码中,位置是在读取流长度之后设置的,现在位置是在读取流长度之前设置的。在这两种情况下,字节长度都不会改变,但检索时保存的文件现在返回相同的字节长度。为什么?不确定,设置流位置不会影响流长度,也不应该影响新实例化的写入程序决定保存字节数组的方式。Gremlins?..

Stream.Read
仅用于读取传递给第三个参数的值。您必须根据需要读取调用和循环的结果。感谢您的建议,但写入已完成,没有任何其他字节可读取。因此writestream.Length是写入的总字节数。文件的另一个保存是storedFile字节数组,例如,它是379528字节,但是当我读取保存为379528字节的文件时,它有379698字节。保存的文件的字节数比我保存的文件的字节数多,这是没有意义的。请提供可靠的数据以再现问题。这里没有足够的信息为您提供答案。见鬼,你甚至没有显示你写文件的代码,这对我来说似乎是一个重要的细节。我已经添加了保存文件的代码。