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

将任意长度的有符号十六进制数转换为有符号十进制数(Excel),excel,excel-formula,hex,decimal,Excel,Excel Formula,Hex,Decimal,问题 当面对长度未知的有符号十六进制数时,如何使用Excel公式轻松地将这些十六进制数转换为十进制数 示例 使用以下深度嵌套: 其中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(L

问题

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

示例

使用以下深度嵌套:

其中
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
   )
可以理解为“首先,将十六进制值转换为无符号十进制值。如果数据的最左半字节包含符号位,则偏移无符号十进制值;否则不偏移。”

转换示例


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)
对于任意长度的字节,请使用以下命令:

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

@Gary的学生,您可能会欣赏对原始答案的扩展。原始公式没有处理具有奇数个半字节的数据,而此公式确实如此。我感谢您的回复@Daniel-我怀疑这对有符号8位整数很有效,但对更宽的数据类型比特宽度无效。哦,很抱歉,您所有的示例都是针对1字节的数字,我将把一般情况添加到我的答案中。我在这里没有使用任何公式,但这个答案很有意义,而且很容易记住。因此,与@EricSchnipke的第一个答案相比,我更喜欢它,因为后者看起来不那么直观。
=HEX2DEC(A1) - IF(HEX2DEC(A1) > POWER(2, 4*LEN(A1))/2 - 1, POWER(2, 4*LEN(A1)), 0)