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

8qgya5xd  于 2023-01-21  发布在  其他
关注(0)|答案(3)|浏览(393)

问题

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

示例

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

gcxthw6b1#

使用下面这个深度嵌套的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
628mspwn

628mspwn2#

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)
oxcyiej7

oxcyiej73#

我通常使用MOD函数,但它需要最大值一半的加减运算。对于8位十六进制数:

=MOD(HEX2DEC(A1) + 2^7, 2^8) - 2^7

当然,可以根据长度得出通用公式:

=MOD(HEX2DEC(A1) + 2^(4*LEN(A1)-1), 2^(4*LEN(A1))) - 2^(4*LEN(A1)-1)

但有时输入值丢失了前导零,或者您使用的是任意长度的十六进制值(我通常需要解码微控制器中的寄存器,其中16位寄存器可能用于3个有符号值)。我更喜欢将位长度单独列示:

=MOD(HEX2DEC(A1) + 2^(B1-1), 2^(B1)) - 2^(B1-1)

转换示例

HEX  | bit # | Dec
-----|-------|------
   0 |    8  |    0
  FF |    8  |   -1
  FF |   16  |  255
FFFE |   16  |   -2
 2FF |   10  | -257

相关问题