Konwertuj liczbę dziesiętną na szesnastkową w skrypcie powłoki UNIX
110
Czego mogę użyć w skrypcie powłoki UNIX do konwersji liczb dziesiętnych na szesnastkowe? Myślałem, że od to załatwi, ale nie zdaje sobie sprawy, że karmię go reprezentacjami liczb w ASCII.
printf? Obrzydliwy! Używam go na razie, ale co jeszcze jest dostępne?
Muszę zapytać, co jest obrzydliwego w printf? Wiele popularnych języków programowania obsługuje formatowanie podobne do printf, więc poniższe rozwiązania printf z pewnością byłyby najłatwiejsze do zrozumienia dla programistów.
@skiphoppy: Jeśli napiszesz: echo "obase = 16; 12 34 56" | bc otrzymujesz 1E240, dokładnie tak samo, jak napisałeś: echo "obase = 16; 123456" | pne. Tak więc sposobem radzenia sobie z dowolnymi liczbami całkowitymi znajdującymi się w jednym wierszu jest umieszczenie każdej liczby w osobnym wierszu: tr '' '\ 015' <input | bc (odwzorowuj puste miejsca na znaki nowej linii).
@Bill Karwin, czy zsh, czy busybox, ale może nie jakaś powłoka, której nie próbowałem? Nie instaluję już zwykłego sh, ale najwyraźniej skiphoppy szuka innych opcji
@ Sridhar-Sarnobat, jest to liczba dziesiętna na szesnastkową. Zakładam, że masz na myśli konwersję hex na dec. Aby to zrobić, ustaw ibase=16. Możesz przeczytać podręcznik bc, aby uzyskać więcej informacji.
Prawdopodobnie istnieją sposoby na zrobienie tego za pomocą wbudowanych funkcji we wszystkich powłokach, ale byłoby to mniej przenośne. Nie sprawdzałem specyfikacji POSIX sh, aby zobaczyć, czy ma takie możliwości.
printf nie jest arbitralną precyzją. bcjest. na przykład, przyjmując 238862874857408875879219909679752457540jako dane wejściowe, printf daje nam „Wynik za duży”. metoda BC sprawdza się świetnie w przypadku rzeczy większych niż standardowe int / long / bigint
@Matthieu Wspomina o problemie liczb z zerami wiodącymi, które Bash printf niepomocnie interpretuje jako ósemkowe, i demonstruje rozwiązanie, które pozwala uniknąć problemu.
# 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 in1) 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.";;esacdone
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.