#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: