【问题标题】:7 Byte Hex to Dec Conversion7 字节十六进制到十进制转换
【发布时间】:2018-06-12 10:19:01
【问题描述】:

我需要将 Excel 列中的 7 字节十六进制值转换为相邻列中的十进制等效值。

我有超过 2000 个唯一值可以从十六进制转换为十进制。

我使用 Excel 的 hex2bin 和 bin2dec 公式。
我发现 Excel 会四舍五入最不重要的 4 位小数。

示例:
7字节十六进制:0x803277323A8904
Excel 输出:36084284544158000
正确的十进制数:36084284544157956

【问题讨论】:

  • 你有解密密钥吗?就像 7Byte Hex 中的每个值一样,您在 Decimal Number 中有相应的值?如果是这样,请告诉我,我可以通过VLOOKUP 帮助您制作解密代码。
  • 嗨@DirtyDeffy,没有解密密钥......只是直接的十六进制到十进制转换......虽然从其他回复看来,excel可能是我的问题的限制因素......
  • 我错过了什么吗?您的十六进制最低有效数字是 4 - 因此您的十进制也应该以 4 结尾?

标签: vba excel hex


【解决方案1】:

这是Rick Rothstein's code的一个小变种

Function HexToDecs(ByVal HexString As String) As String
  Dim X As Integer
  Dim BinStr As String
  Const BinValues = "0000000100100011010001010110011110001001101010111100110111101111"
  If Left$(HexString, 2) Like "&[hH]" Then
    HexString = Mid$(HexString, 3)
  End If
  If Len(HexString) <= 23 Then
    For X = 1 To Len(HexString)
      BinStr = BinStr & Mid$(BinValues, 4 * Val("&h" & Mid$(HexString, X, 1)) + 1, 4)
    Next
    HexToDecd = CDec(0)
    For X = 0 To Len(BinStr) - 1
      HexToDecd = HexToDecd + Val(Mid(BinStr, Len(BinStr) - X, 1)) * 2 ^ X
    Next
  Else
    ' Number is too big, handle error here
  End If
  HexToDecs = CStr(HexToDecd)
End Function

注意:

  • UDF() 返回整数的字符串表示形式,以避免对真实数值的 15 位限制。
  • 我选择不以 0x 开始我的输入字符串

【讨论】:

    【解决方案2】:

    Excel 最大位数。在 Excel 电子表格中,单元格中存储的数字有一个限制,即 15 位(15 个数字),无论数字是否为小数位。 Excel 将此称为“15 位有效数字精度”,符合“IEEE 754”。2015 年 2 月 24 日

    为了有 36084284544157956,它有 17 个数字,将单元格保存为文本。


    即使是 VBA 也不喜欢显示这么大的数字:

    Public Sub TestMe()
    
        Dim inputString As String: inputString = "123456789012345678"
        Dim someValue As Double
    
        someValue = inputString
        Debug.Print someValue + 1
    
    End Sub
    

    获取:1,23456789012346E+17


    要在 Excel 单元格中显示文本值,请确保在将文本放入单元格之前格式化单元格:

    Option Explicit
    
    Public Sub TestMe()
    
        With Range("D2")
            .NumberFormat = "@"
            .Value2 = "123456789012345678"
        End With
    
    End Sub
    

    【讨论】:

    • 谢谢@Vityata。是否可以在文本格式的单元格中显示 VBA 输出,或者这会阻止 VB 模块运行?
    • 我不太明白在哪里配置我想用你的脚本从十六进制转换为十进制的数据范围。你能向我解释一下吗?
    • @Aston - 这里 - Range("D2").NumberFormat = "@"
    猜你喜欢
    • 2023-03-14
    • 2012-01-24
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多