十六进制转十进制 $((0039))

十六进制转十进制 $((0039))

我有一个很长的文件,其值如下:

0030..0039
2194..2199
21A9..21AA
231A..231B
23E9..23F3
23F8..23FA
25AA..25AB

我想将十六进制转换为十进制格式。我是阅读您可以使用$(($HEX)),但将上述文件应用于我返回的每个号码:

$((0039))
bash: 0039: value too great for base (error token is "0039")

这里到底出了什么问题,该消息让我认为它知道我想要做什么,而不是$(39)读取不同的错误。但据说这个数字太大了。

似乎是一个奇怪的错误消息,有人可以解释一下吗?

答案1

以零开头的数字被假定为八进制数。
八进制数的数字应在 0-7 范围内(不能是 8 或 9)。

因此, 9 英寸0039“对于基础来说价值太大”

不过,这是可行的(假设 0039 是十六进制数字):

$ echo $((0x0039))
57

如果您想要转换数字,请执行以下操作:

$ number=0039
$ printf 'octal=%o decimal=%d hexadecimal=%x\n' "$((0x$number))"{,,}
octal=71 decimal=57 hexadecimal=39

答案2

使用 GNU awk:

$ awk -F'[.][.]' '{printf "%d..%d\n", strtonum("0x"$1), strtonum("0x0"$2)}' file
48..57
8596..8601
8617..8618
8986..8987
9193..9203
9208..9210
9642..9643

-F'[.][.]'告诉 awk 我们的输入字段由 分隔..

该格式"%d..%d\n"指定我们希望输出中的十进制数字由两个句点分隔。

strtonum是 awk 将字符串转换为数字的函数。为了告诉 awk 该数字是十六进制,我们0x在它前面加上"0x"$1or "0x"$2

相关内容