将任何长度的有符号十六进制数转换为有符号十进制数 (Excel)

Eri*_*pke 2 excel hex decimal excel-formula

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

例子

Hex
---
00
FF
FE
FD
0A
0B
Run Code Online (Sandbox Code Playgroud)

Eri*_*pke 9

使用这个深度嵌套的公式

=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)
Run Code Online (Sandbox Code Playgroud)

其中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
   )
Run Code Online (Sandbox Code Playgroud)

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

示例转换

Hex  | Dec
-----|----
00   |   0
FF   |  -1
FE   |  -2
FD   |  -3
0A   |  10
0B   |  11
Run Code Online (Sandbox Code Playgroud)


Dan*_*iel 5

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

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

=HEX2DEC(A1) - IF(HEX2DEC(A1) > 127, 256, 0)
Run Code Online (Sandbox Code Playgroud)

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

=HEX2DEC(A1) - IF(HEX2DEC(A1) > 2^(4*LEN(A1))/2 - 1, 2^(4*LEN(A1)), 0)
Run Code Online (Sandbox Code Playgroud)