【问题标题】:How to convert Hexadecimal to Decimal in bash/scripting by only using functions如何仅使用函数在 bash/脚本中将十六进制转换为十进制
【发布时间】:2018-07-02 07:21:43
【问题描述】:

你好,我对 bash 编程非常陌生,对于一项任务,他们要求我从所有基本类型转换为所有其他基本类型(一次转换一次)例如:十进制到二进制,二进制到十进制,十六进制到二进制和返回等。问题是我们不允许使用任何类型的技巧或捷径,例如使用 bc、poisix 或任何类型的 oneliner 解决方案。即使 printf 也是禁止的。我们需要使用我们自己的函数,就像我为二进制到十进制所做的那样

for (( x=0; num>0; x++ )); do
  em=$(echo $(( $num % 2 )))#divides num in 2 remainder gets stored in rem, num #keeps the same value
  num=$(( $num/2))#num gets divided by two and stores its new value
  array[x]=$rem
done

#printing part
if [ $x=0 ]; then #dont know why it doesnt work if i take this "if" out.
  for (( x=${#array[@]}-1; x>=0; x-- )); do #prints all remainders backwards
    echo "${array[x]"
  done
fi

希望你现在知道我所说的“没有捷径或技巧”是什么意思。 所以这是我现在面临的实际问题.. 您在此转换中看到 num 的值是由用户通过以下方式引入的: read num 但现在我需要将十六进制转换为十进制值。我不确定是否使用数组或我还能做些什么来评估包含数字和字母的变量中的字符,同时评估或比较他们..我想尝试: if [ ${array[x]} -eq "A" ];然后 数组[x]=10 不过好吧…… 我如何分解这样引入的值:6C3 并将每个字符分别存储在数组中,同时保持其值并能够比较它/执行操作.. 感谢您的宝贵时间。

【问题讨论】:

  • 真的很想知道他们想通过这个作业教你什么...
  • @IgnacioVazquez-Abrams :这看起来像是一个真正“把头发放在胸前”的练习 ;-) 或者,O.P. 工作的行业中,基本转换的详细知识是一项关键技能?祝大家好运!

标签: arrays bash function scripting hex


【解决方案1】:

总是有人告诉我,您可以通过将该数字后面的单个数字转换为另一个数字,然后将该数字乘以该数字的底数并确定它所在的位置。

首先我编写了一个函数来将单个数字从十六进制转换为十进制。然后我将数字从最高有效位(从左边的一位)转换为 dec,然后乘以 16,然后添加下一位,然后再乘以 16,依此类推。

hextodec1() {
        case "$1" in
        [0-9]) echo "$1"; ;;
        a|A) echo 10; ;;
        b|B) echo 11; ;;
        c|C) echo 12; ;;
        d|D) echo 13; ;;
        e|E) echo 14; ;;
        f|F) echo 15; ;;
        esac
}

out=0
for ((i = ${#num} - 1; i >= 0; --i)); do
        ((out = out * 16 + $(hextodec1 ${num:$i:1}) ))
done
echo $out

您可以使用${variable_name:$start_position:$length}提取字符串的子字符串。
但实际上最简单的方法是这样做:

echo $((0x$num))

你的算法需要一些修正,因为 bash 默认理解十进制数,如果伪装成 0x 则理解十六进制数。所以你循环 for (( x=0; num>0; x++ )); donum=6C3 不起作用,因为 num 是一个字符串,而 bash 无法将数字 x 与字符串 6C3 进行比较。您可以使用for ((x=0;(0x$num)>0;++x)); do,但您最好只使用echo $((0x$num)),因为您第一次将num=$(( (0x$num) % 2 )) 转换为十进制,下次bash 进入循环条件时,该变量将是十进制而不是十六进制。

【讨论】:

    猜你喜欢
    • 2016-05-21
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 2013-09-23
    • 2015-01-26
    • 1970-01-01
    相关资源
    最近更新 更多