Имя: Пароль:
1C
1С v8
Как программно получить контрольную сумму MD5 для файла в 8.2?
,
0 VitaliySm
 
03.02.16
23:41
Необходимо программно получить контрольную сумму файла MD5 платформа 8.2.18, ОС - Windows Server 2008 R2 Enterprise 64. Пробовал через CAPICOM но она в системе не установлена и админы не очень хотят её ставить. Может есть у кого другой вариант?
1 Garykom
 
гуру
03.02.16
23:42
.Net ?
2 su_mai
 
04.02.16
00:31
(0) JavaScript?
3 VitaliySm
 
04.02.16
00:37
скрипты находил, но там только для переданной строки, а мне нужно получить MD5 для файла
4 VitaliySm
 
04.02.16
01:24
Решил. Может кому пригодится, решение ниже:

Функция MD5Файл(тИмяФайла)
   Crypt = Новый COMОбъект("System.Security.Cryptography.SHA1Managed");

   Stream = Новый COMОбъект("ADODB.Stream");
   Stream.Open();
   Stream.Type = 1;
   Stream.LoadFromFile(тИмяФайла);

   HashArray = Crypt.ComputeHash_2(Stream.Read());

   Hash = "";
   Для Каждого Число Из HashArray Цикл
      Hash = Hash + DecToHex(Число);
   КонецЦикла;

   Возврат Hash;
КонецФункции

Функция DecToHex(Знач Число)
   тЧисло = Число;
   тБаза = 16;

   Пока тЧисло <> 0 Цикл
      тПоз =тЧисло % тБаза;
      Результат = Сред("0123456789abcdef", тПоз + 1, 1) + Результат;
      тЧисло = Цел(тЧисло / тБаза);
   КонецЦикла;

   Если Число < тБаза Тогда
      Результат = "0" + Результат;
   КонецЕсли;

   Возврат Результат;
КонецФункции
5 Garykom
 
гуру
04.02.16
01:25
У меня короче ))

ПолноеИмяФайла = "D:\123.jpg";
врап=новый COMОбъект("NetObjectToIDispatch45");
md = врап.ПолучитьТип("System.Security.Cryptography.MD5");
md5 = md.Create();
file = врап.ПолучитьТип("System.IO.File");
stream = file.OpenRead(ПолноеИмяФайла);
data = md5.ComputeHash(stream);
bc = врап.ПолучитьТип("System.BitConverter");
хеш = bc.ToString(data);
хеш = СтрЗаменить(хеш, "-", "");
Сообщить("MD5 хеш = "+хеш);
6 Garykom
 
гуру
04.02.16
01:30
(4) и вы SHA1 посчитали а не MD5 ))
7 Serginio1
 
04.02.16
10:04
(5) Ну сегодня красный день календаря. Ты после меня и oleg_km третий человек кто на форуме использует NetObjectToIDispatch45

Кстати насчет ресурсов, то их желательно закрывать
Обычно это
stream.Close();

Но универсально так
Врап.ПолучитьИнтерфейс(stream,"IDisposable").Dispose();

А то Dispose вызовется только при сборке мусора (неизвестно когда) и у тебя не будет доступа к файлу на запись
Спасибо!!
8 oleg_km
 
04.02.16
10:49
В 8.3 вроде встроенный объект появился ХешированиеДанных, но меня уже ломает на него переделывать.
9 Serginio1
 
04.02.16
11:17
(8) Ну у него 8.2.
Но если честно самому проще использовать классы .Net чем отслеживать нововведения в новых версиях или просто использовать уже отлаженный код используя примеры которых куча чем переписывать его под 1С
10 oleg_km
 
04.02.16
14:55
(9) От тож
11 ДенисЧ
 
04.02.16
14:57
(9) А может сразу уйти с 1с и не тащить в неё всякие поделки?
12 Serginio1
 
04.02.16
16:02
(11) А зачем если они мне облегчают жизнь? Я просто сочувствую тебе? раз ты не умеешь их не только готовить, но и применять
13 Serginio1
 
04.02.16
16:32
(11) Кстати я с 1С больше 20 лет. С .Net 13 лет. Зачем мне куда то уходить. Мне проще их скрещивать увеличивая функциональность, в том числе для интеграции с другими системами.
14 Garykom
 
гуру
04.02.16
16:49
(13) +1

для работы лучше выбирать тот инструмент который более подходит
из тех которыми умеешь пользоваться