修改后的Memorystream字节长度小于保存时的长度

时间:2015-03-26 22:30:26

标签: c# .net file io stream

我将二进制文件加载到内存流中并修改字节,然后将文件存储到磁盘。但是为了节省时间,我保留修改后的字节数组来计算校验和。当我从磁盘加载保存的文件并计算校验和时,文件长度与保存时的原始字节长度不同,大约为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

1 个答案:

答案 0 :(得分:0)

通过简单地改变设置流位置的点,问题似乎已经解决了:

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

在前面的代码中,在读取流长度后设置了位置,现在在读取流长度之前设置了位置。在任何一种情况下,字节长度都不会改变,但是检索时保存的文件现在返回相同的字节长度。为什么?不确定,设置流位置不会影响流长度,也不会影响新实例化的编写器如何决定保存字节数组。小魔怪?...