【问题标题】:Is it possible to do an md5 check without writing to the filesystem?是否可以在不写入文件系统的情况下进行 md5 检查?
【发布时间】:2014-09-15 23:30:10
【问题描述】:

基本上我在做以下事情:

  1. 将加密文件从网站下载到 MemoryStream 中
  2. 解密文件
  3. 将解密后的文件写入文件系统
  4. 将其作为 FileStream 再次读回内存
  5. 计算 MD5 并检查。
  6. 将文件发送到打印机。

这是我的代码:

private async void DownloadFileToBePrinted()
{

    using (WebClient client = new WebClient())
    {
        var data = await client.DownloadDataTaskAsync(new Uri(Url));                

        using (var ms = new MemoryStream(data))
        {                    
            valid = DecodeFile(ms);

        }
    }
}

private bool DecodeFile(MemoryStream stream)
{
    bool valid = true;

    try
    {
        using (StreamReader reader = new StreamReader(stream))
        {
            stream.Position = 0;
            var str = reader.ReadToEnd();

            File.WriteAllBytes(FILE_TO_BE_PRINTED, this.Decode(str));

            using (var md5 = MD5.Create())
            {
                using (var fs = File.OpenRead(FILE_TO_BE_PRINTED))
                {
                    var hash = md5.ComputeHash(fs);

                    if (ByteToHex(hash) != FileDetails.MD5) // check against stored md5
                        valid = false;
                }
            }
        }
    }
    catch(Exception ex)
    {
        valid = false;
    }
    return (valid);
}

这似乎有点低效,除了如果可以避免的情况下要求不将文件写入文件系统这一事实。

所以我想知道是否可以在不将文件写入文件系统的情况下执行此操作?如果有怎么办?

【问题讨论】:

  • 你能发布你当前的代码吗?
  • 已添加代码。基本上,一旦我有了 FileStream,我就没事了。我只是不确定如何在不先写入文件系统的情况下到达那里(或者即使可能)。

标签: c# md5 filestream memorystream


【解决方案1】:

您可以像这样在没有 FileStream 的情况下计算 MD5:

byte[] decoded = this.Decode(str);
var md5 = MD5.Create();
md5.ComputeHash(decoded);

【讨论】:

  • 这看起来像我想要的。除了 FileStream 没有接受 0 个参数的构造函数。
  • @AdamJones 问题是您需要 FileStream 进行打印,而不是哈希计算,对吧?因为你可以从一个字节数组中计算出哈希。
  • 是的,这确实解决了我的 MD5 检查问题。我现在也许可以自己解决那个打印机问题。谢谢。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 2020-05-09
  • 2021-04-19
  • 1970-01-01
相关资源
最近更新 更多