UNIXシェルスクリプトでは、10進数を16進数に変換するために何を使用できますか? odでうまくいくと思ったが、数字のASCII表現を与えていることに気付いていない。
printf?キモい!今のところそれを使用していますが、他に何が利用可能ですか?
echo "obase=16; 34" | bc
整数のファイル全体を1行に1つずつフィルタリングする場合:
( echo "obase=16" ; cat file_of_integers ) | bc
printf(1)
を試しましたか?
printf "%x\n" 34
22
すべてのシェルに組み込み関数を使用してそれを行う方法はおそらくありますが、移植性は低くなります。 POSIX shの仕様を調べて、そのような機能があるかどうかを確認していません。
16進数から10進数:
$ echo $((0xfee10000))
4276158464
10進数から16進数:
$ 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
試してください:
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にも同様の機能があると思います。
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
これはシェルスクリプトではありませんが、bin/oct/dec/hexの間で数値を変換するために使用しているcliツールです。
#!/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);
}
私の場合、printfソリューションの使用に関する1つの問題に遭遇しました。
$ printf "%x" 008 bash: printf: 008: invalid octal number
最も簡単な方法は、bcでソリューションを使用することでした。
$ bc <<< "obase=16; 008" 8