【问题标题】:Modified Memorystream Byte length less than when its saved修改后的 Memorystream 字节长度小于其保存时的长度
【发布时间】:2015-05-31 03:42:24
【问题描述】:

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

     } 

任何建议将不胜感激。

谢谢

【问题讨论】:

  • Stream.Read 只需要读取您传入第三个参数的值。您必须根据需要读取调用和循环的结果。
  • 感谢您的建议,但写入已完成,没有任何其他字节可读取。所以 writestream.Length 是写入的总字节数。文件的保存也是storedFile字节数组,例如,它是379528字节,但是当我读取保存为379528字节的文件时,它有379698。保存的文件有更多字节没有意义比我保存的那样。
  • 请提供可靠地重现问题的a good, minimal, complete code example。这里根本没有足够的信息来为您提供答案。哎呀,您甚至没有显示代码您在哪里编写文件,这对我来说似乎是一个重要的细节。
  • 我已经添加了保存文件的代码。

标签: c# .net file io stream


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-12-20
    • 1970-01-01
    • 2019-11-04
    • 2020-05-03
    • 2023-01-19
    • 1970-01-01
    • 2013-10-24
    • 2019-06-29
    • 2018-11-13
    相关资源
    最近更新 更多