Condividi tramite

Calcolo codice Hash MD5 in Excel Visual Basic

Anonimo
2014-11-20T14:16:49+00:00

Ho questo codice in C Sharp..volevo sapere se esisteva un equivalente in Visual Basic per Macro in Excel. Calcola codice hash M5 e lo converte in base 64. Ho trovato degli esempi ma non mi calcolano il codice desiderato. Grazie 

.NET framework 4

using System.Security.Cryptography;

public static string GetFileHash(string pFileName)

{

string retValue = string.Empty;

using (FileStream fs = File.OpenRead(pFileName))

{

MD5 sscMD5 = MD5.Create();

byte[] mHash = sscMD5.ComputeHash(fs);

retValue = Convert.ToBase64String(mHash);

}

return retValue;

}

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

13 risposte

Ordina per: Più utili
  1. Anonimo
    2014-12-01T17:53:56+00:00

    Ciao Salvatore,

    Dim objXML As MSXML2.DOMDocument

        Dim objNode As MSXML2.IXMLDOMElement

    Mi dice che questi due oggetti non sono definiti dall'utente. che riferimento mi serve?

    Nel VBE,  **Menu | Strumenti | Riferimenti |**inserisci un riferimento alla libreria  Microsoft XML v2.6 (o una versione piu' recente).

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2014-12-01T16:42:01+00:00

    Grazie mille per la risposta!

    Dim objXML As MSXML2.DOMDocument

        Dim objNode As MSXML2.IXMLDOMElement

    Mi dice che questi due oggetti non sono definiti dall'utente. che riferimento mi serve? 

    grazie

    salvo

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2014-11-21T15:52:47+00:00

    Ciao Salvatore,

    vedi se in questo modo arrivi al tuo risultato (all'interno delle funzioni ho scritto i link da cui le ho tratte). In un modulo VBA inserisci questo codice:


    Public Function FileToMD5Hex(sFileName As String) As String

    'https://stackoverflow.com/questions/2826302/how-to-get-the-md5-hex-hash-for-a-file-using-vba

        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

    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

    Public Function EncodeBase64(text As String) As String

    'https://stackoverflow.com/questions/169907/how-do-i-base64-encode-a-string-efficiently-using-excel-vba

        Dim arrData() As Byte

        Dim objXML As MSXML2.DOMDocument

        Dim objNode As MSXML2.IXMLDOMElement

        arrData = StrConv(text, vbFromUnicode)

        Set objXML = New MSXML2.DOMDocument

        Set objNode = objXML.createElement("b64")

        objNode.DataType = "bin.base64"

        objNode.nodeTypedValue = arrData

        EncodeBase64 = objNode.text

        Set objNode = Nothing

        Set objXML = Nothing

    End Function


    A questo punto richiamando le funzioni in questo modo:

    EncodeBase64(FileToMD5Hex(NOME FILE COMPLETO DI PATH))

    dovresti ottenere ciò che cerchi.

    David

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2014-11-21T09:01:26+00:00

    Grazie per l'aiuto. Ho scritto un codice ma non mi restituisce il risultato desiderato. Non ho mai usato C# quindi non saprei neanche come iniziare a fare una .dll in C#. 

    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

    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

    Function Base64Encode(sText)

        Dim oXML, oNode

        Set oXML = CreateObject("Msxml2.DOMDocument.3.0")

        Set oNode = oXML.createElement("base64")

        oNode.DataType = "bin.base64"

        oNode.nodeTypedValue = Stream_StringToBinary(sText)

        Base64Encode = oNode.Text

        Set oNode = Nothing

        Set oXML = Nothing

    End Function

    Function Stream_StringToBinary(Text)

      Const adTypeText = 2

      Const adTypeBinary = 1

      'Create Stream object

      Dim BinaryStream 'As New Stream

      Set BinaryStream = CreateObject("ADODB.Stream")

      'Specify stream type - we want To save text/string data.

      BinaryStream.Type = adTypeText

      'Specify charset For the source text (unicode) data.

      BinaryStream.Charset = "us-ascii"

      'Open the stream And write text/string data To the object

      BinaryStream.Open

      BinaryStream.WriteText Text

      'Change stream type To binary

      BinaryStream.Position = 0

      BinaryStream.Type = adTypeBinary

      'Ignore first two bytes - sign of

      BinaryStream.Position = 0

      'Open the stream And get binary data from the object

      Stream_StringToBinary = BinaryStream.Read

      Set BinaryStream = Nothing

    End Function

    Public Sub mia()

    Dim a As String

    Dim b As String

    Dim c As String

    b = "C:\Users\diana.cafasso\Desktop\condizionigenerali.pdf"           'path del mio file pdf

    a = FileToMD5Hex(b)

    MsgBox a, vbCritical

    c = Modulo3.Base64Encode(a)

    MsgBox c, vbOKOnly

    End Sub

    risultato desiderato: 5Eex+/PbBctonAGi3ePPaA==

    risultato ottenuto: ZTQ0N2IxZmJmM2RiMDVjYjY4OWMwMWEyZGRlM2NmNjg=

    Grazie

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2014-11-20T14:43:47+00:00

    volevo sapere se esisteva un equivalente in Visual Basic per Macro in Excel. Calcola codice hash M5 e lo converte in base 64.

    <cut>

    Soluzione 1.

    Vedi:

    Soluzione 2.

    Fai una .dll in C# e poi utilizzala da VBA. Ne abbiamo discusso qui:

    Una volta compilata, è ininfluente che sia scritta in C# o vb.net.

    La risposta è stata utile?

    0 commenti Nessun commento