Convierta decimal a hexadecimal en script de shell UNIX
(9)
¿Intentó printf(1)
?
printf "%x/n" 34
22
Probablemente haya formas de hacerlo con funciones integradas en todas las cubiertas, pero sería menos portátil. No he comprobado las especificaciones de POSIX sh para ver si tiene tales capacidades.
En un script de shell UNIX, ¿qué puedo usar para convertir números decimales a hexadecimales? Pensé que od haría el truco, pero no me estoy dando cuenta de que estoy alimentando las representaciones ASCII de números.
printf? ¡Bruto! Usándolo por ahora, pero ¿qué más hay disponible?
En zsh
puedes hacer este tipo de cosas:
% 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
Ejemplo tomado de la página de documentación de zsh
sobre la evaluación aritmética .
Creo que Bash tiene capacidades similares.
En mi caso, me encontré con un problema con el uso de la solución printf:
$ printf "%x" 008 bash: printf: 008: invalid octal number
La forma más fácil era usar la solución con bc , sugerida en post mayor:
$ bc <<< "obase=16; 008" 8
Lo siento, culpa mía, intenta esto ...
#!/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}"
Ejemplo:
$ ./dtoh 1024
400
Tratar:
printf "%X/n" ${MY_NUMBER}
Hexadecimal a decimal:
$ echo $((0xfee10000))
4276158464
De decimal a hexadecimal:
$ printf ''%x/n'' 26
1a
# 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
bash-4.2$ printf ''%x/n'' 4294967295
ffffffff
bash-4.2$ printf -v hex ''%x'' 4294967295
bash-4.2$ echo $hex
ffffffff
echo "obase=16; 34" | bc
Si desea filtrar un archivo completo de enteros, uno por línea:
( echo "obase=16" ; cat file_of_integers ) | bc