Имя: Пароль:
1C
1С v8
Быстрое вычисление хэша файла без прав админа
,
0 TormozIT
 
гуру
06.12.12
16:07
Раньше пользовался этим http://xstandard.com (freeware) для вычисления MD5 для файлов произвольного размера. Однако она требует регистрации в HKLM и соответственно админских прав для установки.

А теперь потребовалось без прав админа поиметь тоже самое (не обязательно MD5). В идеале хотелось бы нативную внешнюю компоненту. Может кто поделится или кинет ссылку?
1 TormozIT
 
гуру
06.12.12
17:15
Желаемого решения не нашел.
Из хромых выбрал вариант через CAPICOM
http://infostart.ru/public/82506/
2 kvk
 
06.12.12
19:25
Если есть .Net Framework, то можно в сторону http://infostart.ru/public/20035/ посмотреть, если бесплатно то как-то так еще попробовать:


   WSS = Новый COMОбъект("Wscript.Shell");
   command = "$file = New-Object System.IO.FileStream('D:\temp\ubuntu-12.04-desktop-i386.iso', [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::Read, 16kb);" +
   "$CSP = New-Object 'System.Security.Cryptography.MD5CryptoServiceProvider';" +
   "$hash = ($CSP.ComputeHash($file) | ForEach-Object {$_.ToString('x2')}) -join '';" +
   "$file.Close(); $hash";
   oExec = WSS.exec("powershell -WindowStyle Hidden -Command " + command);
   oExec.StdIn.Close();
   Пока (oExec.Status <> 1) Цикл
       Предупреждение("Считаем!!", 1);
   КонецЦикла;
   Сообщить(oExec.StdOut.ReadAll());
3 Chai Nic
 
06.12.12
19:27
А md5.exe запускать религия не позволяет?
4 H A D G E H O G s
 
06.12.12
19:48
(1) Почему хромых?
5 vde69
 
06.12.12
19:50
http://code.google.com/p/restoration-base-1c8/downloads/detail?name=Bin1CD_VK_DistrNative_1_1_7.rar&can=2&q=

правда это простое CRC, работает ОЧЕНЬ БЫСТРО!
6 vde69
 
06.12.12
19:54
(4)CAPICOM - больше не поддерживается
7 TormozIT
 
гуру
06.12.12
23:55
(5) В описании не нашел. Она будет без админских прав регистрироваться?
8 vde69
 
модератор
07.12.12
00:17
(7) технология - навите, по идее права не нужны,

порядок быдкет такой

.OpenFile (ИмяФайла)
.РасчитатьCRC32/CallCRC32 ()  
= .CRC
.CloseFile ()

по идее можешь под себя ее заточить, процедуру OpenFile упростить, там для тебя есть лишнее :)
9 Torquader
 
07.12.12
01:46
Я, например, недавно расчёт MD5 просто на VbScript написал, причём без использования сдвиговых операций - только на умножении, делении и битовых операциях на целых со знаком - пришлось их на две переменные делить - но - оно даже работает.
Могу куда-нить выложить, если кого-то заинтересует.
10 Bober
 
07.12.12
06:38
(9) интересно
11 Torquader
 
07.12.12
21:33
Это алгоритм на VbScript, который формирует алгоритм для расчёта суммы Md5.

' 05-12-2012 Алгоритм формирования алгоритма контрольной суммы MD5 проверен.
' Данный алгоритм формирует файл сценария, в котором получается сам алгоритм.
' Запускать файл рекомендуется только один раз.
' Из самого алгоритма желательно удалить тестовую функцию, чтобы не занимала места.
Set fso=CreateObject("Scripting.FileSystemObject")
Set f=fso.CreateTextFile("Md5Str.vbs",True,0)
f.WriteLine("'Md5 runtime siute - autogenerated")
Function GetHex(ByRef s)
   Dim l
   Dim i
   Dim j
   l=Len(s)
   GetHex=0
   For i=1 To l Step 1
       j=Asc(Mid(s,i,1))
       If(j>=48)AND(j<=57)Then
           GetHex=(GetHex*16)+(j-48)
       ElseIf(j>=65)AND(j<=70)Then
           GetHex=(GetHex*16)+(j-55)
       ElseIf(j>=97)AND(j<=102)Then
           GetHex=(GetHex*16)+(j-87)
       Else
           GetHex=GetHex/0
       End If
   Next
End Function
Function OutTl(ByRef i)
   Dim r
   Dim j
   r=Int(4294967296*abs(sin(i)))
   s=""
   j=Int(r/65536)
   OutTl=CStr(r-(j*65536))
End Function
Function OutTh(ByRef i)
   Dim r
   Dim j
   r=Int(4294967296*abs(sin(i)))
   j=Int(r/65536)
   OutTh=CStr(j)
End Function
Function OutF(ByRef lh,ByRef x,ByRef y,ByRef z)
   OutF="((((" & x & lh & " AND " & y & lh & ")OR((NOT " & x & lh & ")AND " & z & lh & ")))AND 65535)"
End Function
Function OutG(ByRef lh,ByRef x,ByRef y,ByRef z)
   OutG="((((" & x & lh & " AND " & z & lh & ")OR(" & y & lh & " AND (NOT " & z & lh & "))))AND 65535)"
End Function
Function OutH(ByRef lh,ByRef x,ByRef y,ByRef z)
   OutH="((((" & x & lh & " XOR " & y & lh & ")XOR " & z & lh & "))AND 65535)"
End Function
Function OutI(ByRef lh,ByRef x,ByRef y,ByRef z)
   OutI="(((" & y & lh & " XOR(" & x & lh & " OR(NOT " & z & lh & "))))AND 65535)"
End Function
Function LeftMask16(ByRef v)
   Dim i
   i=v
   LeftMask16=0
   While i>0
       LeftMask16=(LeftMask16*2)+1
       i=i-1
   Wend
End Function
Function RightMask16(ByRef v)
   Dim i
   i=v
   RightMask16=0
   While i>0
       RightMask16=(RightMask16/2)+32768
       i=i-1
   Wend
End Function
Function TwoPower(ByRef p)
   Dim i
   i=p
   TwoPower=1
   While i>0
       TwoPower=TwoPower*2
       i=i-1
   Wend
End Function
Sub RotateLeft(ByRef s)
   If s=0 Then
       f.WriteLine(vbTab & "Rl=l")
       f.WriteLine(vbTab & "Rh=h")
   ElseIf s=16 Then
       f.WriteLine(vbTab & "Rh=l")
       f.WriteLine(vbTab & "Rl=h")
   ElseIf s<16 Then
       f.WriteLine(vbTab & "Rl=((l AND " & LeftMask16(16-s) & ")*" & TwoPower(s) & ")OR((h AND " & RightMask16(s) & ")/" & TwoPower(16-s) & ")")
       f.WriteLine(vbTab & "Rh=((h AND " & LeftMask16(16-s) & ")*" & TwoPower(s) & ")OR((l AND " & RightMask16(s) & ")/" & TwoPower(16-s) & ")")
   ElseIf s<32 Then
       f.WriteLine(vbTab & "Rl=((l AND " & RightMask16(s-16) & ")/" & TwoPower(32-s) & ")OR((h AND " & LeftMask16(32-s) & ")*" & TwoPower(s-16) & ")")
       f.WriteLine(vbTab & "Rh=((h AND " & RightMask16(s-16) & ")/" & TwoPower(32-s) & ")OR((l AND " & LeftMask16(32-s) & ")*" & TwoPower(s-16) & ")")
   End If
End Sub
Sub RotateLeftOld(ByRef s)
   Dim i
   Dim m1
   Dim m2
   Dim n1
   Dim n2
   If s=0 Then
       f.WriteLine(vbTab & "rl=l")
       f.WriteLine(vbTab & "rh=h")
   ElseIf s<16 Then
       m1=65535
       n1=1
       n2=65536
       For i=1 To s Step 1
           m1=m1\2
           n1=n1*2
           n2=n2\2
       Next
       m2=65535 XOR m1
       f.WriteLine(vbTab & "rl=((l AND " & CStr(m1) & ")* " & CStr(n1) & ")OR((h AND " & CStr(m2) & ")\ " & CStr(n2) & ")")
       f.WriteLine(vbTab & "rh=((h AND " & CStr(m1) & ")* " & CStr(n1) & ")OR((l AND " & CStr(m2) & ")\ " & CStr(n2) & ")")
   ElseIf s>16 Then
       m1=0
       n1=1
       n2=65536
       For i=31 To s Step -1
           m1=(m1*2)+1
           n1=n1*2
           n2=n2\2
       Next
       m2=65535 XOR m1
       f.WriteLine(vbTab & "rl=((l AND " & CStr(m2) & ")\ " & CStr(n1) & ")OR((h AND " & CStr(m1) & ")* " & CStr(n2) & ")")
       f.WriteLine(vbTab & "rh=((h AND " & CStr(m2) & ")\ " & CStr(n1) & ")OR((l AND " & CStr(m1) & ")* " & CStr(n2) & ")")
   Else
       f.WriteLine(vbTab & "rl=h")
       f.WriteLine(vbTab & "rh=l")
   End If
End Sub
Sub BlockOne(ByRef t,ByRef k,ByRef s,ByRef i)
   Dim a
   Dim b
   Dim c
   Dim d
   a=Mid(t,1,1)
   b=Mid(t,2,1)
   c=Mid(t,3,1)
   d=Mid(t,4,1)
   f.WriteLine(vbTab & "l=" & OutF("l",b,c,d) & "+" & a & "l+Xl(" & CStr(k) & ")+" & OutTl(i))
   f.WriteLine(vbTab & "h=" & OutF("h",b,c,d) & "+" & a & "h+Xh(" & CStr(k) & ")+" & OutTh(i))
   f.WriteLine(vbTab & "h=(h+(l\65536))AND 65535")
   f.WriteLine(vbTab & "l=l AND 65535")
   ' теперь циклический поворот налево на S для h и l
   RotateLeft s
   f.WriteLine(vbTab & "rl=" & b & "l+rl")
   f.WriteLine(vbTab & a & "h=(" & b & "h+rh+(rl\65536))AND 65535")
   f.WriteLine(vbTab & a & "l=rl AND 65535")
End Sub
Sub BlockTwo(ByRef t,ByRef k,ByRef s,ByRef i)
   Dim a
   Dim b
   Dim c
   Dim d
   a=Mid(t,1,1)
   b=Mid(t,2,1)
   c=Mid(t,3,1)
   d=Mid(t,4,1)
   f.WriteLine(vbTab & "l=" & OutG("l",b,c,d) & "+" & a & "l+Xl(" & CStr(k) & ")+" & OutTl(i))
   f.WriteLine(vbTab & "h=" & OutG("h",b,c,d) & "+" & a & "h+Xh(" & CStr(k) & ")+" & OutTh(i))
   f.WriteLine(vbTab & "h=(h+(l\65536))AND 65535")
   f.WriteLine(vbTab & "l=l AND 65535")
   ' теперь циклический поворот налево на S для h и l
   RotateLeft s
   f.WriteLine(vbTab & "rl=" & b & "l+rl")
   f.WriteLine(vbTab & a & "h=(" & b & "h+rh+(rl\65536))AND 65535")
   f.WriteLine(vbTab & a & "l=rl AND 65535")
End Sub
Sub BlockThree(ByRef t,ByRef k,ByRef s,ByRef i)
   Dim a
   Dim b
   Dim c
   Dim d
   a=Mid(t,1,1)
   b=Mid(t,2,1)
   c=Mid(t,3,1)
   d=Mid(t,4,1)
   f.WriteLine(vbTab & "l=" & OutH("l",b,c,d) & "+" & a & "l+Xl(" & CStr(k) & ")+" & OutTl(i))
   f.WriteLine(vbTab & "h=" & OutH("h",b,c,d) & "+" & a & "h+Xh(" & CStr(k) & ")+" & OutTh(i))
   f.WriteLine(vbTab & "h=(h+(l\65536))AND 65535")
   f.WriteLine(vbTab & "l=l AND 65535")
   ' теперь циклический поворот налево на S для h и l
   RotateLeft s
   f.WriteLine(vbTab & "rl=" & b & "l+rl")
   f.WriteLine(vbTab & a & "h=(" & b & "h+rh+(rl\65536))AND 65535")
   f.WriteLine(vbTab & a & "l=rl AND 65535")
End Sub
Sub BlockFour(ByRef t,ByRef k,ByRef s,ByRef i)
   Dim a
   Dim b
   Dim c
   Dim d
   a=Mid(t,1,1)
   b=Mid(t,2,1)
   c=Mid(t,3,1)
   d=Mid(t,4,1)
   f.WriteLine(vbTab & "l=" & OutI("l",b,c,d) & "+" & a & "l+Xl(" & CStr(k) & ")+" & OutTl(i))
   f.WriteLine(vbTab & "h=" & OutI("h",b,c,d) & "+" & a & "h+Xh(" & CStr(k) & ")+" & OutTh(i))
   f.WriteLine(vbTab & "h=(h+(l\65536))AND 65535")
   f.WriteLine(vbTab & "l=l AND 65535")
   ' теперь циклический поворот налево на S для h и l
   RotateLeft s
   f.WriteLine(vbTab & "rl=" & b & "l+rl")
   f.WriteLine(vbTab & a & "h=(" & b & "h+rh+(rl\65536))AND 65535")
   f.WriteLine(vbTab & a & "l=rl AND 65535")
End Sub
f.WriteLine("Function Md5_Step(ByRef Xl(),ByRef Xh(),ByRef Al,ByRef Ah,ByRef Bl,ByRef Bh,ByRef Cl,ByRef Ch,ByRef Dl,ByRef Dh)")
f.WriteLine(vbTab & "Dim l")
f.WriteLine(vbTab & "Dim h")
f.WriteLine(vbTab & "Dim rl")
f.WriteLine(vbTab & "Dim rh")
Dim i
Dim j
For i=1 To 4 Step 1
   j=Mid("ABCD",i,1)
   f.WriteLine(vbTab & "Dim l" & j & "l")
   f.WriteLine(vbTab & "Dim l" & j & "h")
Next
For i=1 To 4 Step 1
   j=Mid("ABCD",i,1)
   f.WriteLine(vbTab & "l" & j & "l=" & j & "l")
   f.WriteLine(vbTab & "l" & j & "h=" & j & "h")
Next
BlockOne "ABCD",0,7,1
   BlockOne "DABC",1,12,2
       BlockOne "CDAB",2,17,3
           BlockOne "BCDA",3,22,4
BlockOne "ABCD",4,7,5
   BlockOne "DABC",5,12,6
       BlockOne "CDAB",6,17,7
           BlockOne "BCDA",7,22,8
BlockOne "ABCD",8,7,9
   BlockOne "DABC",9,12,10
       BlockOne "CDAB",10,17,11
           BlockOne "BCDA",11,22,12
BlockOne "ABCD",12,7,13
   BlockOne "DABC",13,12,14
       BlockOne "CDAB",14,17,15
           BlockOne "BCDA",15,22,16
BlockTwo "ABCD",1,5,17
   BlockTwo "DABC",6,9,18
       BlockTwo "CDAB",11,14,19
           BlockTwo "BCDA",0,20,20
BlockTwo "ABCD",5,5,21
   BlockTwo "DABC",10,9,22
       BlockTwo "CDAB",15,14,23
           BlockTwo "BCDA",4,20,24
BlockTwo "ABCD",9,5,25
   BlockTwo "DABC",14,9,26
       BlockTwo "CDAB",3,14,27
           BlockTwo "BCDA",8,20,28
BlockTwo "ABCD",13,5,29
   BlockTwo "DABC",2,9,30
       BlockTwo "CDAB",7,14,31
           BlockTwo "BCDA",12,20,32
BlockThree "ABCD",5,4,33
   BlockThree "DABC",8,11,34
       BlockThree "CDAB",11,16,35
           BlockThree "BCDA",14,23,36
BlockThree "ABCD",1,4,37
   BlockThree "DABC",4,11,38
       BlockThree "CDAB",7,16,39
           BlockThree "BCDA",10,23,40
BlockThree "ABCD",13,4,41
   BlockThree "DABC",0,11,42
       BlockThree "CDAB",3,16,43
           BlockThree "BCDA",6,23,44
BlockThree "ABCD",9,4,45
   BlockThree "DABC",12,11,46
       BlockThree "CDAB",15,16,47
           BlockThree "BCDA",2,23,48
BlockFour "ABCD",0,6,49
   BlockFour "DABC",7,10,50
       BlockFour "CDAB",14,15,51
           BlockFour "BCDA",5,21,52
BlockFour "ABCD",12,6,53
   BlockFour "DABC",3,10,54
       BlockFour "CDAB",10,15,55
           BlockFour "BCDA",1,21,56
BlockFour "ABCD",8,6,57
   BlockFour "DABC",15,10,58
       BlockFour "CDAB",6,15,59
           BlockFour "BCDA",13,21,60
BlockFour "ABCD",4,6,61
   BlockFour "DABC",11,10,62
       BlockFour "CDAB",2,15,63
           BlockFour "BCDA",9,21,64
' теперь сложение
For i=1 To 4 Step 1
   j=Mid("ABCD",i,1)
   f.WriteLine(vbTab & j & "l=l" & j & "l+" & j & "l")
   f.WriteLine(vbTab & j & "h=l" & j & "h+" & j & "h")
   f.WriteLine(vbTab & j & "h=(" & j & "h+(" & j & "l\65536))AND 65535")
   f.WriteLine(vbTab & j & "l=" & j & "l AND 65535")
Next
f.WriteLine("End Function")
f.WriteLine("Function Md5OutHexDigit(ByRef d)")
f.WriteLine(vbTab & "If d<10 Then Md5OutHexDigit=Chr(d+48)Else Md5OutHexDigit=Chr(d+87)")
f.WriteLine("End Function")
f.WriteLine("Function Md5Count(ByRef s,ByRef f)")
For i=1 To 4 Step 1
   j=Mid("ABCD",i,1)
   f.WriteLine(vbTab & "Dim " & j & "l")
   f.WriteLine(vbTab & "Dim " & j & "h")
Next
f.WriteLine(vbTab & "Dim Xl(15)")
f.WriteLine(vbTab & "Dim Xh(15)")
f.WriteLine(vbTab & "Dim l")
f.WriteLine(vbTab & "Dim m")
f.WriteLine(vbTab & "Dim i")
f.WriteLine(vbTab & "Dim j")
f.WriteLine(vbTab & "Dim k")
f.WriteLine(vbTab & "Dim n")
f.WriteLine(vbTab & "l=Len(s)") ' количество байт в исходном сообщении
f.WriteLine(vbTab & "i=l")
f.WriteLine(vbTab & "m=Chr((i AND 31)*8)")
f.WriteLine(vbTab & "i=i\32")
f.WriteLine(vbTab & "For j=1 To 7 Step 1")
f.WriteLine(vbTab & vbTab & "m=m & Chr(i AND 255)")
f.WriteLine(vbTab & vbTab & "i=i\256")
f.WriteLine(vbTab & "Next")
f.WriteLine(vbTab & "Al=" & CStr(GetHex("2301")))
f.WriteLine(vbTab & "Ah=" & CStr(GetHex("6745")))
f.WriteLine(vbTab & "Bl=" & CStr(GetHex("AB89")))
f.WriteLine(vbTab & "Bh=" & CStr(GetHex("EFCD")))
f.WriteLine(vbTab & "Cl=" & CStr(GetHex("DCFE")))
f.WriteLine(vbTab & "Ch=" & CStr(GetHex("98BA")))
f.WriteLine(vbTab & "Dl=" & CStr(GetHex("5476")))
f.WriteLine(vbTab & "Dh=" & CStr(GetHex("1032")))
f.WriteLine(vbTab & "n=l-(l AND 63)")
f.WriteLine(vbTab & "i=1")
f.WriteLine(vbTab & "Do")
f.WriteLine(vbTab & vbTab & "If i>=n Then Exit Do")
f.WriteLine(vbTab & vbTab & "For j=0 To 15 Step 1")
f.WriteLine(vbTab & vbTab & vbTab & "k=(j*4)+i")
f.WriteLine(vbTab & vbTab & vbTab & "Xl(j)=Asc(Mid(s,k,1))+(Asc(Mid(s,k+1,1))*256)")
f.WriteLine(vbTab & vbTab & vbTab & "Xh(j)=Asc(Mid(s,k+2,1))+(Asc(Mid(s,k+3,1))*256)")
f.WriteLine(vbTab & vbTab & "Next")
f.WriteLine(vbTab & vbTab & "Md5_Step Xl,Xh,Al,Ah,Bl,Bh,Cl,Ch,Dl,Dh")
f.WriteLine(vbTab & vbTab & "i=i+64")
f.WriteLine(vbTab & "Loop")
' У нас может быть или один или два шага
f.WriteLine(vbTab & "If(l AND 63)<55 Then")
f.WriteLine(vbTab & vbTab & "For j=0 To 15 Step 1")
f.WriteLine(vbTab & vbTab & vbTab & "k=(j*4)+n")
f.WriteLine(vbTab & vbTab & vbTab & "If k<l Then i=Asc(Mid(s,k+1,1)) Else If k=l Then i=128 Else If j=14 Then i=Asc(Mid(m,1,1)) Else If j=15 Then i=Asc(Mid(m,5,1)) Else i=0")
f.WriteLine(vbTab & vbTab & vbTab & "Xl(j)=i")
f.WriteLine(vbTab & vbTab & vbTab & "k=k+1")
f.WriteLine(vbTab & vbTab & vbTab & "If k<l Then i=Asc(Mid(s,k+1,1)) Else If k=l Then i=128 Else If j=14 Then i=Asc(Mid(m,2,1)) Else If j=15 Then i=Asc(Mid(m,6,1)) Else i=0")
f.WriteLine(vbTab & vbTab & vbTab & "Xl(j)=Xl(j)+(i*256)")
f.WriteLine(vbTab & vbTab & vbTab & "k=k+1")
f.WriteLine(vbTab & vbTab & vbTab & "If k<l Then i=Asc(Mid(s,k+1,1)) Else If k=l Then i=128 Else If j=14 Then i=Asc(Mid(m,3,1)) Else If j=15 Then i=Asc(Mid(m,7,1)) Else i=0")
f.WriteLine(vbTab & vbTab & vbTab & "Xh(j)=i")
f.WriteLine(vbTab & vbTab & vbTab & "k=k+1")
f.WriteLine(vbTab & vbTab & vbTab & "If k<l Then i=Asc(Mid(s,k+1,1)) Else If k=l Then i=128 Else If j=14 Then i=Asc(Mid(m,4,1)) Else If j=15 Then i=Asc(Mid(m,8,1)) Else i=0")
f.WriteLine(vbTab & vbTab & vbTab & "Xh(j)=Xh(j)+(i*256)")
f.WriteLine(vbTab & vbTab & "Next")
f.WriteLine(vbTab & vbTab & "Md5_Step Xl,Xh,Al,Ah,Bl,Bh,Cl,Ch,Dl,Dh")
f.WriteLine(vbTab & "Else")
f.WriteLine(vbTab & vbTab & "For j=0 To 15 Step 1")
f.WriteLine(vbTab & vbTab & vbTab & "k=(j*4)+n")
f.WriteLine(vbTab & vbTab & vbTab & "If k<l Then i=Asc(Mid(s,k+1,1)) Else If k=l Then i=128 Else i=0")
f.WriteLine(vbTab & vbTab & vbTab & "Xl(j)=i")
f.WriteLine(vbTab & vbTab & vbTab & "k=k+1")
f.WriteLine(vbTab & vbTab & vbTab & "If k<l Then i=Asc(Mid(s,k+1,1)) Else If k=l Then i=128 Else i=0")
f.WriteLine(vbTab & vbTab & vbTab & "Xl(j)=Xl(j)+(i*256)")
f.WriteLine(vbTab & vbTab & vbTab & "k=k+1")
f.WriteLine(vbTab & vbTab & vbTab & "If k<l Then i=Asc(Mid(s,k+1,1)) Else If k=l Then i=128 Else i=0")
f.WriteLine(vbTab & vbTab & vbTab & "Xh(j)=i")
f.WriteLine(vbTab & vbTab & vbTab & "k=k+1")
f.WriteLine(vbTab & vbTab & vbTab & "If k<l Then i=Asc(Mid(s,k+1,1)) Else If k=l Then i=128 Else i=0")
f.WriteLine(vbTab & vbTab & vbTab & "Xh(j)=Xh(j)+(i*256)")
f.WriteLine(vbTab & vbTab & "Next")
f.WriteLine(vbTab & vbTab & "Md5_Step Xl,Xh,Al,Ah,Bl,Bh,Cl,Ch,Dl,Dh")
f.WriteLine(vbTab & vbTab & "For j=0 To 13 Step 1")
f.WriteLine(vbTab & vbTab & vbTab & "Xl(j)=0")
f.WriteLine(vbTab & vbTab & vbTab & "Xh(j)=0")
f.WriteLine(vbTab & vbTab & "Next")
f.WriteLine(vbTab & vbTab & "Xl(14)=Asc(Mid(m,1,1))+(Asc(Mid(m,2,1))*256)")
f.WriteLine(vbTab & vbTab & "Xh(14)=Asc(Mid(m,3,1))+(Asc(Mid(m,4,1))*256)")
f.WriteLine(vbTab & vbTab & "Xl(15)=Asc(Mid(m,5,1))+(Asc(Mid(m,6,1))*256)")
f.WriteLine(vbTab & vbTab & "Xh(15)=Asc(Mid(m,7,1))+(Asc(Mid(m,8,1))*256)")
f.WriteLine(vbTab & vbTab & "Md5_Step Xl,Xh,Al,Ah,Bl,Bh,Cl,Ch,Dl,Dh")
f.WriteLine(vbTab & "End If")
f.WriteLine(vbTab & "If f=True Then")
Dim s
Dim k
Dim l
s=""
For i=1 To 4 Step 1
   k=Mid("ABCD",i,1)
   For j=1 To 2 Step 1
       l=Mid("lh",j,1)
       If s<>"" Then s=s & " & "
       s=s & "Chr(" & k & l & " AND 255) & Chr(" & k & l & " \ 256)"
   Next
Next
f.WriteLine(vbTab & vbTab & "Md5Count=" & s)
f.WriteLine(vbTab & "Else")
s=""
For i=1 To 4 Step 1
   k=Mid("ABCD",i,1)
   For j=1 To 2 Step 1
       l=Mid("lh",j,1)
       If s<>"" Then s=s & " & "
       s=s & "Md5OutHexDigit((" & k & l & " AND 240)\16) & Md5OutHexDigit(" & k & l & " AND 15) & Md5OutHexDigit((" & k & l & " AND 61440)\4096) & Md5OutHexDigit((" & k & l & " AND 3840)\256)"
   Next
Next
f.WriteLine(vbTab & vbTab & "Md5Count=" & s)
f.WriteLine(vbTab & "End If")
f.WriteLine("End Function")
Sub WriteTestLine(ByRef f,ByRef s)
   f.WriteLine(vbTab & "s=s & vbCrLf & ""(" & s & ") => "" & Md5Count(""" & s & """,False)")
End Sub
Sub PrintMd5Test(ByRef f)
   f.WriteLine("' For test only - remove from real package")
   f.WriteLine("Sub Md5Test()")
   f.WriteLine(vbTab & "Dim s")
   f.WriteLine(vbTab & "s=""Md Test Siute:""")
   WriteTestLine f,""
   WriteTestLine f,"a"
   WriteTestLine f,"abc"
   WriteTestLine f,"message digest"
   WriteTestLine f,"abcdefghijklmnopqrstuvwxyz"
   WriteTestLine f,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
   WriteTestLine f,"12345678901234567890123456789012345678901234567890123456789012345678901234567890"
   f.WriteLine(vbTab & "MsgBox s,0,""Test""")
   f.WriteLine("End Sub")
   f.WriteLine("Md5Test")
End Sub
' можно отключить, если не нужно тестирование
PrintMd5Test f
f.Close()
MsgBox "OK",0,"OK"
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший