Ответ 1
echo "obase=16; 34" | bc
Если вы хотите отфильтровать целый файл целых чисел, по одному в строке:
( echo "obase=16" ; cat file_of_integers ) | bc
В оболочке UNIX script, что я могу использовать для преобразования десятичных чисел в шестнадцатеричный? Я думал, что это сделает трюк, но это не означает, что я кормлю его ASCII-представлениями чисел.
Printf? Валовой! Используя это сейчас, но что еще доступно?
echo "obase=16; 34" | bc
Если вы хотите отфильтровать целый файл целых чисел, по одному в строке:
( echo "obase=16" ; cat file_of_integers ) | bc
Пробовал printf(1)
?
printf "%x\n" 34
22
Вероятно, есть способы сделать это со встроенными функциями во всех оболочках, но он будет менее переносимым. Я не проверял спецификации POSIX sh, чтобы увидеть, есть ли у него такие возможности.
От шестнадцатеричного до десятичного:
$ echo $((0xfee10000))
4276158464
Десятичное в шестнадцатеричное:
$ printf '%x\n' 26
1a
bash-4.2$ printf '%x\n' 4294967295
ffffffff
bash-4.2$ printf -v hex '%x' 4294967295
bash-4.2$ echo $hex
ffffffff
Извините, я виноват, попробуйте это...
#!/bin/bash
:
declare -r HEX_DIGITS="0123456789ABCDEF"
dec_value=$1
hex_value=""
until [ $dec_value == 0 ]; do
rem_value=$((dec_value % 16))
dec_value=$((dec_value / 16))
hex_digit=${HEX_DIGITS:$rem_value:1}
hex_value="${hex_digit}${hex_value}"
done
echo -e "${hex_value}"
Пример:
$ ./dtoh 1024
400
Try:
printf "%X\n" ${MY_NUMBER}
В zsh
вы можете делать такие вещи:
% typeset -i 16 y
% print $(( [#8] x = 32, y = 32 ))
8#40
% print $x $y
8#40 16#20
% setopt c_bases
% print $y
0x20
Пример взят из страницы документации zsh
об арифметической оценке.
Я считаю, что Bash имеет аналогичные возможности.
# number conversion.
while `test $ans='y'`
do
echo "Menu"
echo "1.Decimal to Hexadecimal"
echo "2.Decimal to Octal"
echo "3.Hexadecimal to Binary"
echo "4.Octal to Binary"
echo "5.Hexadecimal to Octal"
echo "6.Octal to Hexadecimal"
echo "7.Exit"
read choice
case $choice in
1) echo "Enter the decimal no."
read n
hex=`echo "ibase=10;obase=16;$n"|bc`
echo "The hexadecimal no. is $hex"
;;
2) echo "Enter the decimal no."
read n
oct=`echo "ibase=10;obase=8;$n"|bc`
echo "The octal no. is $oct"
;;
3) echo "Enter the hexadecimal no."
read n
binary=`echo "ibase=16;obase=2;$n"|bc`
echo "The binary no. is $binary"
;;
4) echo "Enter the octal no."
read n
binary=`echo "ibase=8;obase=2;$n"|bc`
echo "The binary no. is $binary"
;;
5) echo "Enter the hexadecimal no."
read n
oct=`echo "ibase=16;obase=8;$n"|bc`
echo "The octal no. is $oct"
;;
6) echo "Enter the octal no."
read n
hex=`echo "ibase=8;obase=16;$n"|bc`
echo "The hexadecimal no. is $hex"
;;
7) exit
;;
*) echo "invalid no."
;;
esac
done
Это не скрипт оболочки, но это инструмент cli, который я использую для преобразования чисел в bin/oct/dec/hex:
#!/usr/bin/perl
if (@ARGV < 2) {
printf("Convert numbers among bin/oct/dec/hex\n");
printf("\nUsage: base b/o/d/x num num2 ... \n");
exit;
}
for ($i=1; $i<@ARGV; $i++) {
if ($ARGV[0] eq "b") {
$num = oct("0b$ARGV[$i]");
} elsif ($ARGV[0] eq "o") {
$num = oct($ARGV[$i]);
} elsif ($ARGV[0] eq "d") {
$num = $ARGV[$i];
} elsif ($ARGV[0] eq "h") {
$num = hex($ARGV[$i]);
} else {
printf("Usage: base b/o/d/x num num2 ... \n");
exit;
}
printf("0x%x = 0d%d = 0%o = 0b%b\n", $num, $num, $num, $num);
}
xd() {
printf "hex> "
while read i
do
printf "dec $(( 0x${i} ))\n\nhex> "
done
}
dx() {
printf "dec> "
while read i
do
printf 'hex %x\n\ndec> ' $i
done
}
В моем случае я наткнулся на одну проблему с использованием решения printf:
$ printf "%x" 008
bash: printf: 008: invalid octal number
Самый простой способ - использовать решение с bc, предложенное в post выше:
$ bc <<< "obase=16; 008"
8