bash中十六进制到十进制的转换

时间:2018-12-09 18:06:18

标签: linux bash

我在互联网上查找问题,但找不到答案。抱歉,如果之前已回答。这是给bash使用的。

所以我的脚本将读取一个input.dat文件,并将查找行并根据该行进行算术运算。示例:

#input.dat file:
205 - 12
0xFED - 0xABCD

使用代码echo $((p)),其中p是循环计数(帮助我计算和打印每一行),但是0xFED-0xABCD返回-39904,但是我希望它返回其十六进制对应物。

./ test.sh input.dat

while read p; do
echo $((p))
done <$1

返回:

193
-39905

但是如果要对十六进制值进行计算,我希望它返回十六进制结果而不是十进制。

欢迎提出任何想法!

1 个答案:

答案 0 :(得分:0)

使用printf指定应如何打印输出。对于十六进制表示,可以使用%x printf修饰符,对于十进制表示,可以使用%d printf修饰符。

请勿复制以下代码,它将尝试删除驱动器上的所有文件。以下代码中的注释:

# for each line in input
# with leading and trailing whitespaces removed
while IFS=$' \r\n' read -r line; do 

    # ADD HERE: tokenization of line
    # checking if it's valid and safe arithmetic expression

    # run the arithemetical expansion on the line fetching the result
    # this is extremely unsafe, equal to evil eval
    if ! res=$((line)); then
        echo "Arithmetical expansion on '$p' failed!"
        exit 1
    fi

    # check if the line starts with `0x`
    # leading whitespaces are removed, so we can just strip the leading two character
    if [ "${p:0:2}" == "0x" ]; then
        # if it does print the result as a hexadecimal
        printf "%x\n" "$res" 
    else
        printf "%d\n" "$res"
    fi

# use heredoc for testing input
done <<EOF
205 - 12
0xFED - 0xABCD
0 $(echo "I can run any malicious command from here! Let's remove all your files!" >&2; echo rm -rf / )
EOF