我看过一些奇怪的事情。 我尝试使用 bash Shell
将十六进制转换为dec我使用了非常简单的命令。
$ g_receiverBeforeToken=1158e460913d00000
$ echo $((16#$g_receiverBeforeToken))
1553255926290448384
你们知道,这个结果应该是'20000000000000000000'。
当我输入其他十六进制数字时,这是正确的。但是只有 1553255926290448384 很奇怪。
答案 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