=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
)
3条答案
按热度按时间gcxthw6b1#
使用下面这个深度嵌套的formula:
其中
N
是包含十六进制数据的单元。此公式展开后可读性更强:
并且可以被读作“首先,将十六进制值转换为无符号十进制值。然后,如果数据的最左边的半字节包含符号位,则偏移无符号十进制值;否则不偏移。”
转换示例
628mspwn2#
让
A1
单元格包含一个1字节的十六进制字符串,可以是任何大小写。要获取此字符串的2的补码十进制值,请使用以下命令:
对于任意长度的字节,请使用以下命令:
oxcyiej73#
我通常使用MOD函数,但它需要最大值一半的加减运算。对于8位十六进制数:
当然,可以根据长度得出通用公式:
但有时输入值丢失了前导零,或者您使用的是任意长度的十六进制值(我通常需要解码微控制器中的寄存器,其中16位寄存器可能用于3个有符号值)。我更喜欢将位长度单独列示:
转换示例