作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要一个 VBA 例程来计算文件内容的 MD5 哈希值。我找到了一些示例(例如 here ),但我发现当文件名包含某些 Unicode 字符时它们会崩溃,所以我试图调整代码以避免这种情况。
此代码不会导致错误,但也不会返回正确的 MD5 哈希值。怎么了?
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(path As String) As Byte()
Dim fso As Object
Set fso = CreateObject("scripting.FileSystemObject")
Dim fil As Object
Set fil = fso.GetFile(path)
' Dim fpga As Variant
GetFileBytes = fil.OpenAsTextStream().Read(fil.Size)
Set fil = Nothing
Set fso = Nothing
End Function
最佳答案
Scripting.FileSystemObject
无法像 TextStream
一样正确处理一些字符序列。
使用 ADODB.Stream
ActiveX 从文件中检索字节数组。它可以完美地处理文本和二进制类型的数据,还可以更改字符串的字符集(FSO
仅适用于 ASCII 和 Unicode,并且仅适用于文件)。
Function GetFileBytes(strPath As String) As Byte()
With CreateObject("ADODB.Stream")
.Type = 1 ' adTypeBinary
.Open
.LoadFromFile (strPath)
GetFileBytes = .Read()
End With
End Function
另一种处理二进制数据的ActiveX是SAPI.spFileStream
。最显着的优势之一 - 它允许仅将文件的一部分加载到内存中(在某些情况下,当比较大文件时,它可以帮助显着提高性能,逐 block 检查 md5)。
Function GetFileBytes(strPath As String) As Byte()
Dim arrContent As Variant
With CreateObject("SAPI.spFileStream")
.Open strPath, 0
.Read arrContent, CreateObject("Scripting.FileSystemObject").GetFile(strPath).Size
.Close
End With
GetFileBytes = arrContent
End Function
关于VBA 计算文件内容的 MD5 散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33704692/
我是一名优秀的程序员,十分优秀!