用bash将十六进制转换为十进制

时间:2018-11-23 04:22:20

标签: bash

我看过一些奇怪的事情。 我尝试使用 bash Shell

将十六进制转换为dec

我使用了非常简单的命令。

$ g_receiverBeforeToken=1158e460913d00000
$ echo $((16#$g_receiverBeforeToken))
1553255926290448384

你们知道,这个结果应该是'20000000000000000000'。

当我输入其他十六进制数字时,这是正确的。但是只有 1553255926290448384 很奇怪。

2 个答案:

答案 0 :(得分:1)

不仅仅是数字,它还是7fffffffffffffffff之上的任何数字,因为它使用的是64位整数,并且是最大的整数。上方的16位数字环绕并变为负数(由于two's complement representation of signed integers):

$ echo $((16#7fffffffffffffff))
9223372036854775807
$ echo $((16#7fffffffffffffff + 1))
-9223372036854775808
$ echo $((16#8000000000000000))
-9223372036854775808

过去的ffffffffffffffff(又名-1),它会回零:

$ echo $((16#ffffffffffffffff))
-1
$ echo $((16#ffffffffffffffff + 1))
0
$ echo $((16#10000000000000000))
0

最终结果:实际上只有最后16个十六进制数字重要;从64位整数表示形式的高端掉下来的所有过去的东西:

$ echo $((16#0000000000000010))
16
$ echo $((16#10000000000000010))
16
$ echo $((16#ffffffff0000000000000010))
16

由于1553255926290448384长为17位数字,因此以这种方式删除第一位数字:

$ echo $((16#1158e460913d00000))
1553255926290448384
$ echo $((16#158e460913d00000))
1553255926290448384
$ echo $((16#121345158e460913d00000))
1553255926290448384

答案 1 :(得分:1)

您可以将bc作为基本转换和简短的脚本来完成您想做的事情:

#!/bin/bash

## validate sufficient input
test -n "$1" || {
    printf "\n error: insufficient input. usage:  %s num [obase (2)] [ibase (10)]\n\n" "${0//*\//}"
    exit 1
}

## test for help
test "$1" = "-h" || test "$1" = "--help" && {
    printf "\n  usage:  %s num [obase (2)] [ibase (10)] -- to convert number\n\n" "${0//*\//}"
    exit 0
}

## validate numeric value given for conversion (bash only test)
ival="${1^^}"
[[ $ival =~ [^0-9A-F] ]] && {
    printf "\n error: invalid input. Input must be within upper/lower case hex character set [0-9A-Fa-f]\n\n"
    exit 1
}

ob=${2:-2}
ib=${3:-10}

# set obase first before ibase -- or weird things happen.
printf "obase=%d; ibase=%d; %s\n" $ob $ib $ival | bc

使用/输出示例

$ bash hex2dec.sh -h

  usage:  hex2dec.sh num [obase (2)] [ibase (10)] -- to convert number

使用您的示例:

$ bash hex2dec.sh 1158e460913d00000 10 16
20000000000000000000

如果还需要二进制文件,也很方便:

$ bash hex2dec.sh 1158e460913d00000 2 16
10001010110001110010001100000100100010011110100000000000000000000