Как можно преобразовать этот код C # в C / CLI

#c# #c -cli

#c# #c -cli

Вопрос:

Как я могу преобразовать этот сегмент кода 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);

Ответ №1:

Широкое использование семантики стека, доступной в C / CLI, для автоматического удаления объектов. При эмуляции священного шаблона RAII C объект удаляется, даже если код выдает исключение. Думайте об этом как о компиляторе, автоматически генерирующем оператор 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);
    }
};
  

Комментарии:

1. спасибо, Ханс Пассант, я хотел бы спросить вас о % md5.ComputeHash(%file); том, для чего это нужно?

2. Для ComputeHash требуется поток ^, у файла нет шляпы. Оператор % генерирует ссылку.

3. : Ага, если я использую FileStream^ , мне не обязательно использовать %file правильно?

4. Ну, да, но тогда у него была бы та же ошибка, что и у вашего кода C #. При этом файл не закрывается при исключении.

5. ASCII != hex, также в C #. Вы получаете? для любого байтового значения> = 128. Сохраните байты в строке с помощью Convert::ToBase64String() .

Ответ №2:

В верхнем ответе на этот вопрос есть пример использования поставщика криптографических услуг из C для генерации MD5:

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