【问题标题】:How can convert this C# code to C++/CLI如何将此 C# 代码转换为 C++/CLI
【发布时间】:2011-12-08 03:31:53
【问题描述】:

如何将这段 C# 代码转换为 C++/CLI:

protected string GetMD5HashFromFile(string fileName)
{
  FileStream file = new FileStream(fileName, FileMode.Open);
  MD5 md5 = new MD5CryptoServiceProvider();
  byte[] retVal = md5.ComputeHash(file);
  file.Close();
  ASCIIEncoding enc = new ASCIIEncoding();
  return enc.GetString(retVal);
}

特别是这部分byte[] retVal = md5.ComputeHash(file);

【问题讨论】:

    标签: c# c++-cli


    【解决方案1】:

    充分利用 C++/CLI 中可用的堆栈语义来自动处理对象。模拟神圣的 C++ RAII 模式,即使代码抛出异常,对象也会被释放。将其视为编译器自动生成 C# using 语句。看起来像这样:

    using namespace System;
    using namespace System::IO;
    using namespace System::Security::Cryptography;
    using namespace System::Text;
    
    ref class Example {
    protected:
        String^ GetMD5HashFromFile(String^ fileName)
        {      
            FileStream file(fileName, FileMode::Open);
            MD5CryptoServiceProvider md5;
            array<Byte>^ retVal = md5.ComputeHash(%file);
            return Convert::ToBase64String(retVal);
        }
    };
    

    【讨论】:

    • 谢谢Hans Passant,我想问一下% in md5.ComputeHash(%file); 的用途是什么?
    • ComputeHash 需要 Stream^,文件没有帽子。 % 运算符生成引用。
    • :啊哈,如果我使用FileStream^,我就不必使用%file,对吧?
    • 嗯,是的,但是它会出现与您的 C# 代码相同的错误。文件不会因异常而关闭。
    • ASCII != 十六进制,在 C# 中也是如此。你明白了吗?对于任何 >= 128 的字节值。使用 Convert::ToBase64String() 将字节存储在字符串中。
    【解决方案2】:

    在此问题的最佳答案中有一个使用 C++ 的加密服务提供程序生成 MD5 的示例:

    http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/c0f97655-d953-4e3f-82b9-b70edaf1625b/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 2021-12-24
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多