如何在Excel中将十六进制数转换为十进制数?

Nat*_*man 14 conversion microsoft-excel hexadecimal

我有一个包含此值的单元格:

0x00006cd2c0306953
Run Code Online (Sandbox Code Playgroud)

我想把它转换成一个数字。

我试过:

=HEX2DEC(C8)
Run Code Online (Sandbox Code Playgroud)

C8包含我的十六进制值的单元格在哪里。

我收到 #NUM 错误。

我究竟做错了什么?

小智 7

你可以简单地使用:

HEX2DEC(right(A1,(len(A1)-2)))
Run Code Online (Sandbox Code Playgroud)

len(A1)给你0x字符串的长度。排除 的长度0x,剩下的字符串是十六进制数。使用 Excel 函数获取 dec。

  • 你试过这个吗?你读过这个页面上的任何东西吗?“HEX2DEC”最多接受十个十六进制数字,已经说过三遍。问题中的字符串“0x00006cd2c0306953”有 18 个字符长。您的解决方案评估“RIGHT(A1,(LEN(A1)-2))”;18−2 是 16,所以 `RIGHT(...)` 返回 `00006cd2c0306953`,它是 16 位长。即使你去掉前导零,你也有 12 位数字,这 * 仍然 * 太多了。如果你可以让它工作,请描述你的配置。(即,您使用的是哪个版本的 Excel?您是否做了任何棘手的事情来使其工作?) (2认同)

小智 6

正如 TwiterZX 所指出的,Hex2Dec的输入限制为 10 个字符,并且6cd2c0306953是 12 个字符。所以这行不通,但让我们为此推出我们自己的功能。使用VBA,添加一个Module,使用如下代码(可能需要根据自己的需要进行调整)

' Force explicit declaration of variables
Option Explicit


' Convert hex to decimal
' In:   Hex in string format
' Out:  Double
Public Function HexadecimalToDecimal(HexValue As String) As Double

    ' If hex starts with 0x, replace it with &H to represent Hex that VBA will understand
    Dim ModifiedHexValue As String
    ModifiedHexValue = Replace(HexValue, "0x", "&H")

    HexadecimalToDecimal = CDec(ModifiedHexValue)

End Function
Run Code Online (Sandbox Code Playgroud)

在 Excel 中,假设单元格 A1 包含0x00006cd2c0306953,A2 的公式=HexadecimalToDecimal(A1)将导致1.19652E+14. 将列格式化为小数点为零的数字,结果将为119652423330131.


小智 5

HEX2DEC 限制为 10 个字符,但这并不意味着我们不能使用它。只需使用它几次,一次转换 10 个字符,并在每次使用时应用适当的 2 的幂。

= HEX2DEC(RIGHT(C8,10))+HEX2DEC(MID(C8,3,5))*POWER(16,10)
Run Code Online (Sandbox Code Playgroud)

[免责声明:目前未经测试]

稍后:我现在正在使用电子表格,准备进行测试。将 MID 中的 3,5 更改为 3,6。嗯..还是不对。

事实证明,HEX2DEC 正在处理有符号的十六进制值,因此第一项最终为负数。不知道为什么,但这里是添加 2^40(或 16^10,因为我们使用十六进制)来修复的固定版本:

= HEX2DEC(RIGHT(C8,10))+POWER(16,10) + HEX2DEC(MID(C8,3,6))*POWER(16,10)
Run Code Online (Sandbox Code Playgroud)

然而,只有当 RIGHT(C8,10) 恰好为负数时,这才有效。这是我的一般解决方案:

= HEX2DEC(RIGHT(C8,10))+IF(HEX2DEC(RIGHT(C8,10))<0,POWER(16,10),0) + HEX2DEC(MID(C8,3,6))*POWER(16,10)
Run Code Online (Sandbox Code Playgroud)

呃。

  • 只有第 40 位是符号位,因此您可以将 64 位值拆分为两个 32 位值,并且它始终为正数。否则,如果十六进制字符串短于 37 位,则将零填充到该字符串中 (2认同)

小智 2

在不使用函数的情况下执行此转换的一种肮脏方法(请参阅此Excel 论坛线程)是使用此公式来计算字符串中每个字符的值,然后将它们相加。这显然涉及使用临时单元来分解数字:

=HEX2DEC(LEFT(RIGHT(A$1,ROW()),1))*POWER(16,ROW()-1)
Run Code Online (Sandbox Code Playgroud)

假设您将这些临时单元格放在第 1 行到第 16 行上,其工作原理是从右侧开始提取每个字符,将其转换为值,然后应用 16 的相关幂。将所有 16 个单元格相加以获得您的值。