Dans un script UNIX, que puis-je utiliser pour convertir des nombres décimaux en hexadécimal? Je pensais que od ferait l'affaire, mais il ne réalise pas que je lui donne des représentations ASCII de nombres.
printf? Brut! L'utiliser pour le moment, mais quoi d'autre est disponible?
echo "obase=16; 34" | bc
Si vous souhaitez filtrer tout un fichier d'entiers, un par ligne:
( echo "obase=16" ; cat file_of_integers ) | bc
Essayé printf(1)
?
printf "%x\n" 34
22
Il y a probablement moyen de le faire avec des fonctions intégrées dans tous les shells mais ce serait moins portable. Je n'ai pas vérifié les spécifications de POSIX sh pour voir s'il possède de telles capacités.
Hexadécimal à décimal:
$ echo $((0xfee10000))
4276158464
Décimal à hexadécimal:
$ 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
Désolé ma faute, essayez ceci ...
#!/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}"
Exemple:
$ ./dtoh 1024
400
Dans zsh
, vous pouvez faire ce genre de chose:
% 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
Exemple tiré de la page zsh
docs sur l'évaluation arithmétique .
Je crois que Bash a des capacités similaires.
Essayer:
printf "%X\n" ${MY_NUMBER}
Dans mon cas, je suis tombé sur un problème d'utilisation de la solution printf:
$ printf "%x" 008
bash: printf: 008: invalid octal number
Le moyen le plus simple était d’utiliser la solution avec bc , suggérée plus haut:
$ bc <<< "obase=16; 008"
8
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
}
# 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
Ce n'est pas un script Shell, mais c'est l'outil cli que j'utilise pour convertir les nombres parmi 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);
}