2010-05-13 11 views
6

MD5 hex hash dosyasını VBA kullanarak nasıl alabilirim?MD5 hex hash VBA kullanarak bir dosya için nasıl?

Dosya için çalışan bir sürüme ihtiyacım var. Bu Python kodu gibi basit

şey:

import hashlib 

def md5_for_file(fileLocation, block_size=2**20): 
    f = open(fileLocation) 
    md5 = hashlib.md5() 
    while True: 
     data = f.read(block_size) 
     if not data: 
      break 
     md5.update(data) 
    f.close() 
    return md5.hexdigest() 

Ama VBA'DA

.

cevap

3
+0

Bu yalnızca bir dizenin karmasını yapar. Bir dosyada 700mb varsa, hepsini tek bir dizeye ekleyemiyorum ve bunun üzerine md5 hash'ını yapamıyorum. Yani, dosya sürümü veya başka bir çözüm için md5 hash var mı? : P –

-1

Bu yapmalıyım: Daha iyi bir cevap kullanabilirsiniz

 Dim fileBytes() As Byte = File.ReadAllBytes(path:=fullPath) 
     Dim Md5 As New MD5CryptoServiceProvider() 
     Dim byteHash() As Byte = Md5.ComputeHash(fileBytes) 
     Return Convert.ToBase64String(byteHash) 
+0

Huh? Birincisi, bu VB.NET değil VBA ve ikincisi, bazı çok önemli İthalat komutlarını atlıyorsunuz. – Ben

+0

Hata! VBA olarak VB.NET olarak yanlış okumuştum. Yukarıdaki kodu çok basit hale getiren tüm .NET framework desteğine sahip olmadığından VBA biraz daha zor olurdu. İthalat için, Visual Studio muhtemelen sizin için otomatik olarak önerecektir, ancak tamamlama adına, onlar System.IO ve System.Security.Cryptography vardır. –

14

eski bir soru. Bu işlevler özellikle karma dosyalar için değil, karma dosyalar içindir. Bonus olarak SHA1 için bir işlev ekliyorum. Tür bildirimlerinden kurtulursanız, bu işlevler VBScript içinde de çalışır, ancak GetFileBytes işlevinin FileSystemObject (veya muhtemelen ADO Stream) kullanmak için değiştirilmesi gerekir, çünkü Free File VBScript içinde mevcut değildir.

Private Sub TestMD5() 
    Debug.Print FileToMD5Hex("C:\test.txt") 
    Debug.Print FileToSHA1Hex("C:\test.txt") 
End Sub 

Public Function FileToMD5Hex(sFileName As String) As String 
    Dim enc 
    Dim bytes 
    Dim outstr As String 
    Dim pos As Integer 
    Set enc = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider") 
    'Convert the string to a byte array and hash it 
    bytes = GetFileBytes(sFileName) 
    bytes = enc.ComputeHash_2((bytes)) 
    'Convert the byte array to a hex string 
    For pos = 1 To LenB(bytes) 
     outstr = outstr & LCase(Right("0" & Hex(AscB(MidB(bytes, pos, 1))), 2)) 
    Next 
    FileToMD5Hex = outstr 
    Set enc = Nothing 
End Function 

Public Function FileToSHA1Hex(sFileName As String) As String 
    Dim enc 
    Dim bytes 
    Dim outstr As String 
    Dim pos As Integer 
    Set enc = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider") 
    'Convert the string to a byte array and hash it 
    bytes = GetFileBytes(sFileName) 
    bytes = enc.ComputeHash_2((bytes)) 
    'Convert the byte array to a hex string 
    For pos = 1 To LenB(bytes) 
     outstr = outstr & LCase(Right("0" & Hex(AscB(MidB(bytes, pos, 1))), 2)) 
    Next 
    FileToSHA1Hex = outstr 'Returns a 40 byte/character hex string 
    Set enc = Nothing 
End Function 

Private Function GetFileBytes(ByVal path As String) As Byte() 
    Dim lngFileNum As Long 
    Dim bytRtnVal() As Byte 
    lngFileNum = FreeFile 
    If LenB(Dir(path)) Then ''// Does file exist? 
     Open path For Binary Access Read As lngFileNum 
     ReDim bytRtnVal(LOF(lngFileNum) - 1&) As Byte 
     Get lngFileNum, , bytRtnVal 
     Close lngFileNum 
    Else 
     Err.Raise 53 
    End If 
    GetFileBytes = bytRtnVal 
    Erase bytRtnVal 
End Function 
+0

Hızlı soru: UTF8Encoding için "asc" değişkeni hiçbir yerde kullanılmıyor, bu bir amaca hizmet ediyor mu? Ayrıca, VBScript ile çalışmak için muhtemelen dosyayı FreeFile yöntemi yerine bir ADODB.Stream nesnesini kullanarak açmanız gerekecek ... Her durumda Büyük paylaşım! –

+0

Sanırım "asc" şeyleri bu kodu şifrelerle kullanmamdan kaynaklanan eserler olmalı. Onu şimdi kaldırdım. Ve evet, Free File VBScript'te mevcut değil. Dosya Sistemi Nesnesi'ni kullanan işe yaradığını düşündüğüm bir işlevi buldum: http://stackoverflow.com/questions/6060529/read-and-write-binary-file-in-vbscript – HK1

+0

İyi çözüm, Bir çift nite ... 'Dim bytes() Byte' küçük bir kazanç sağlar; ve yeniden yapılandırılmış bir "Özel Alt GetFileBytes" (sFileName As String, arrBytes() By Byte) işlevine atıfta bulunarak, yedek bellek ayırma işlemini tersine çevirdiğiniz anlamına gelir ve bu, kaynak kullanımı ve performansı için bir * gerçek * kazanç anlamına gelir. Odadaki fil, gerçekten büyük dosyalar için, ReDim bytRtnVal (LOF (lngFileNum) - 1 &) As Byte’da hatalar artacaktır. Ancak daha iyi bir şey yayınlayamıyorum, çünkü System.Security.Cryptography işlevlerine herhangi bir "parçalama" veya akış API'si bilmiyorum. –

İlgili konular