【问题标题】:Convert any length signed hexadecimal number to signed decimal number (Excel)将任何长度的有符号十六进制数转换为有符号十进制数 (Excel)
【发布时间】:2019-02-18 12:19:13
【问题描述】:

问题

面对未知长度的有符号十六进制数,如何使用 Excel 公式轻松将这些十六进制数转换为十进制数?

示例

Hex
---
00
FF
FE
FD
0A
0B

【问题讨论】:

    标签: excel excel-formula hex decimal


    【解决方案1】:

    使用这个嵌套很深的formula

    =HEX2DEC(N)-IF(ISERR(FIND(LEFT(IF(ISEVEN(LEN(N)),N,CONCAT(0,N))),"01234567")),16^LEN(IF(ISEVEN(LEN(N)),N,CONCAT(0,N))),0)
    

    其中N 是一个包含十六进制数据的单元格。

    这个公式在展开后变得更易读:

    =HEX2DEC(N) -
     /* check if sign bit is present in leftmost nibble, padding to an even number of digits if necessary */
     IF( ISERR( FIND( LEFT( IF( ISEVEN(LEN(N))
                              , N
                              , CONCAT(0,N)
                              )
                          )
                    , "01234567"
                    )
              )
       /* offset if sign bit is present */
       , 16^LEN( IF( ISEVEN(LEN(N))
                   , N
                   , CONCAT(0,N)
                   )
                )
       /* do not offset if sign bit is absent */
       , 0
       )
    

    并且可以读作“首先,将十六进制值转换为无符号十进制值。如果数据的最左侧半字节包含符号位,则偏移无符号十进制值;否则不偏移。”

    转换示例

    Hex  | Dec
    -----|----
    00   |   0
    FF   |  -1
    FE   |  -2
    FD   |  -3
    0A   |  10
    0B   |  11
    

    【讨论】:

    • @Gary'sStudent,您可能会喜欢这种对原始答案的扩展。原始公式不处理包含奇数个半字节的数据,而这个公式可以。
    【解决方案2】:

    A1 单元格包含一个任意大小写的 1 字节十六进制字符串。

    要获取此字符串的 2 的补码十进制值,请使用以下命令:

    =HEX2DEC(A1)-IF(HEX2DEC(A1) > 127, 256, 0)
    

    对于任意长度的字节,请使用以下内容:

    =HEX2DEC(A1) - IF(HEX2DEC(A1) > POWER(2, 4*LEN(A1))/2 - 1, POWER(2, 4*LEN(A1)), 0)
    

    【讨论】:

    • 感谢您的回复@Daniel - 我怀疑这对于带符号的 8 位整数效果很好,但对于更宽的数据类型位宽会失败。
    • 哦,抱歉,您的所有示例都是针对 1 字节数字的,我将在我的答案中添加一般情况。
    • 我没有在这里使用任何公式,但这个答案是有道理的,而且很容易记住。因此,与@EricSchnipke 的第一个答案相比,我更喜欢它,这看起来不太直观。
    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 2012-10-25
    • 2021-11-05
    相关资源
    最近更新 更多