You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Excel中SHA-256函数需处理二进制数据而非ASCII文本的技术求助

解决Excel中SHA256处理二进制字符串的问题

我明白你现在的痛点——Excel自带的SHA256函数把二进制字符串当成普通文本处理,每个'0'和'1'都按ASCII编码(0x30和0x31)来哈希,这和比特币挖矿教学实验需要的直接处理二进制位序列完全不是一回事。下面给你一套可行的解决方案,用VBA实现正确的转换和哈希计算:

问题根源

你遇到的核心问题是:

  • 正确逻辑:将01组成的字符串视为二进制位流,每8位打包成一个字节,再对字节数组做SHA256哈希(对应Python中bytes.fromhex(string1)转成字节后哈希的结果)
  • 当前Excel逻辑:将字符串的每个字符单独转成ASCII码,再对这些ASCII字节哈希(对应Python中string2.encode('utf-8')后哈希的错误结果)

解决方案:VBA自定义函数组合

我们需要两个核心函数:一个将二进制字符串转成真实的字节数组,另一个对字节数组执行SHA256哈希。

1. 二进制字符串转字节数组函数

这个函数会把输入的01字符串按每8位一组,转换成对应的字节值(自动补前导0确保长度是8的倍数):

Function BinaryStringToByteArray(binStr As String) As Byte()
    Dim byteCount As Integer
    Dim result() As Byte
    Dim i As Integer, j As Integer
    Dim byteVal As Integer
    
    ' 确保二进制字符串长度是8的倍数,不足补前导0
    If Len(binStr) Mod 8 <> 0 Then
        binStr = String(8 - (Len(binStr) Mod 8), "0") & binStr
    End If
    
    byteCount = Len(binStr) / 8
    ReDim result(byteCount - 1)
    
    For i = 0 To byteCount - 1
        byteVal = 0
        For j = 0 To 7
            ' 从左到右按高位到低位计算字节值
            If Mid(binStr, i * 8 + j + 1, 1) = "1" Then
                byteVal = byteVal + (2 ^ (7 - j))
            End If
        Next j
        result(i) = byteVal
    Next i
    
    BinaryStringToByteArray = result
End Function

2. 字节数组SHA256哈希函数

这个函数调用Windows系统的CryptoAPI对字节数组执行SHA256哈希,返回十六进制结果:

Function SHA256ByteArray(inputBytes() As Byte) As String
    Dim cryptoProvider As Object
    Dim hashBytes() As Byte
    Dim result As String
    Dim i As Integer
    
    Set cryptoProvider = CreateObject("CAPICOM.HashedData")
    cryptoProvider.Algorithm = 3 ' 指定SHA256算法(CAPICOM_HASH_ALGORITHM_SHA256)
    
    cryptoProvider.Hash inputBytes
    hashBytes = cryptoProvider.Value
    
    ' 将字节数组转成小写十六进制字符串
    result = ""
    For i = 0 To UBound(hashBytes)
        result = result & Right("0" & Hex(hashBytes(i)), 2)
    Next i
    
    SHA256ByteArray = LCase(result)
End Function

3. 组合调用函数

把上面两个函数包装成一个可以直接在Excel单元格调用的函数:

Function SHA256FromBinaryString(binStr As String) As String
    Dim byteArr() As Byte
    byteArr = BinaryStringToByteArray(binStr)
    SHA256FromBinaryString = SHA256ByteArray(byteArr)
End Function

使用方法

  1. 打开Excel,按下Alt + F11打开VBA编辑器
  2. 右键点击左侧的工作簿名称,选择「插入」→「模块」
  3. 将上面三段代码粘贴到模块窗口中
  4. 返回Excel工作表,在单元格中输入=SHA256FromBinaryString(A1)(A1是存放二进制字符串的单元格)

验证示例

用你提供的测试数据验证:

  • 输入二进制字符串string2,调用=SHA256FromBinaryString(A1)会返回正确结果:cd93fc352d3b9f27392b3052c61190609fdc80194ade62771ce9588808980be9,和Python中hashlib.sha256(bytes.fromhex(string1)).hexdigest()的输出完全一致。

注意事项

如果你的系统无法调用CAPICOM组件(比如某些精简版Windows),可以替换SHA256ByteArray函数为纯VBA实现的SHA256算法(网上有很多成熟的纯VBA SHA256代码,只需将其输入参数改为字节数组即可)。

内容的提问来源于stack exchange,提问作者Zippo76

火山引擎 最新活动