Мне всегда говорили, что вы должны преобразовать число из одной базы в другую, преобразовав одну цифру сзади в этом числе, а затем умножить это число на основание и положение, в котором оно находится.
Сначала я написал функцию для преобразования одной цифры из шестнадцатеричного в десятичное. Затем я преобразую число из самой значимой цифры (от цифры слева) в 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++ )); do
не будет работать для num=6C3
, поскольку num - это строка, а bash не может сравнить число x
со строкой 6C3
. Вы можете сделать for ((x=0;(0x$num)>0;++x)); do
, но тогда вам лучше всего просто echo $((0x$num))
, потому что в первый раз вы num=$(( (0x$num) % 2 ))
будете преобразовывать его в десятичное число, а в следующий раз, когда bash входит в условие цикла, переменная будет в десятичном, а не шестнадцатеричном виде.