Имя: Пароль:
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

для работы лучше выбирать тот инструмент который более подходит
из тех которыми умеешь пользоваться
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn