Как преобразовать шестнадцатеричный массив в массив целых чисел base10?

    local regex="s/rgb:\([^/]\+\)\/\([^/]\+\)\/\([^/]\+\)/\1 \2 \3/p"
    local colors=$(xtermcontrol --get-bg | sed -n $regex)
    local base10_colors=()
    for i in 1 2 3; do
        $base10_colors[i]=$((16#$colors[i]))
    done

У меня есть это сейчас, но это не работает.

0
03.03.2017, 18:10
1 ответ

Если у вас есть переменная с шестнадцатеричным числом, например 'FF00', и вы хотите преобразовать его в десятичное, то вы можете использовать bc:

hex='FF00'
dec=$( printf 'ibase=16; %s\n' "$hex" | bc )

Здесь bc выведет 65280, и оболочка сохранит его как строку в переменной dec.

Установка ibase=16 сообщает bc, что входное основание равно 16 (т.е. шестнадцатеричное). Она также имеет переменную obase (выходное основание), которую можно использовать вместе с ibase для произвольных преобразований.

Если у вас есть массив шестнадцатеричных значений:

colors=( $(xtermcontrol --get-bg | sed -n $regex) )
typeset -a base10_colors
for hex in "${colors[@]}"; do
  base10_colors+=( "$( printf 'ibase=16; %s\n' "$hex" | bc )" )
done

Или, с помощью синтаксиса zsh:

colors=( $(xtermcontrol --get-bg | sed -n $regex) )
typeset -a base10_colors
for hex in "${colors[@]}"; do
  base10_colors+=( $((16#$hex)) )
done
0
28.01.2020, 04:48

Теги

Похожие вопросы