У скрипті оболонки UNIX, що я можу використовувати для перетворення десяткових чисел у шістнадцятковий? Я думав, що Од зробить трюк, але це не зрозуміє, що я його подаю ASCII уявленням чисел.
printf? Валовий! Використовуйте його наразі, але що ще є?
У скрипті оболонки UNIX, що я можу використовувати для перетворення десяткових чисел у шістнадцятковий? Я думав, що Од зробить трюк, але це не зрозуміє, що я його подаю ASCII уявленням чисел.
printf? Валовий! Використовуйте його наразі, але що ще є?
Відповіді:
echo "obase=16; 34" | bc
Якщо ви хочете відфільтрувати цілий файл цілих чисел, по одному на рядок:
( echo "obase=16" ; cat file_of_integers ) | bc
ibase=16. Ви можете прочитати посібник на bc для отримання більш детальної інформації.
Пробували printf(1)?
printf "%x\n" 34
22
Ймовірно, є способи зробити це з вбудованими функціями у всіх оболонках, але це було б менш портативно. Я не перевіряв специфікації POSIX sh, щоб побачити, чи має він такі можливості.
bcє. наприклад, беручи 238862874857408875879219909679752457540за вхід, printf дає нам "Результат занадто великий". метод BC ідеально підходить для речей, більших за стандартний int / long / bigint
printf "%X"великими літерами X.
bcдоступний не скрізь (принаймні, не в моєму вбудованому Linux).
bash-4.2$ printf '%x\n' 4294967295
ffffffff
bash-4.2$ printf -v hex '%x' 4294967295
bash-4.2$ echo $hex
ffffffff
-v VARє розширенням bash. Не згадується на сторінці чоловіка , виявляється лише в тому випадку, якщо хтось телефонує printfбез аргументів
Вибачте за мою провину, спробуйте це ...
#!/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і hexкоманди недоступні.
printfнедоступний?
У 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сторінці документів про арифметичну оцінку .
Я вважаю, що Баш має подібні можливості.
У моєму випадку я натрапив на одну проблему із використанням рішення printf:
$ printf "%x" 008
bash: printf: 008: invalid octal number
Найпростішим способом було використання рішення з bc , запропонованого в пост вище:
$ bc <<< "obase=16; 008"
8
# 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);
}