Преобразование десятичного числа в шестнадцатеричное в сценарии оболочки UNIX
в сценарии оболочки UNIX, что я могу использовать для преобразования десятичных чисел в шестнадцатеричные? Я думал, что od сделает трюк, но он не понимает, что я кормлю его ASCII-представлениями чисел.
printf? Мерзость! Используя его сейчас, но что еще доступно?
10 ответов:
echo "obase=16; 34" | bcЕсли вы хотите отфильтровать весь файл целых чисел, по одному на строку:
( echo "obase=16" ; cat file_of_integers ) | bc
пробовал
printf(1)?printf "%x\n" 34 22вероятно, есть способы сделать это со встроенными функциями во всех оболочках, но это было бы менее переносимо. Я не проверял спецификации POSIX sh, чтобы увидеть, есть ли у него такие возможности.
шестнадцатеричные в десятичные:
$ echo $((0xfee10000)) 4276158464десятичной в шестнадцатеричную:
$ 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= 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
на
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страница документов об арифметической оценке.Я считаю, что Баш имеет аналогичные возможности.
# 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
в моем случае я наткнулся на одну проблему с использованием решения printf:
$ printf "%x" 008 bash: printf: 008: invalid octal numberсамый простой способ-использовать раствор с bc, предложил в посте выше:
$ bc <<< "obase=16; 008" 8
это не сценарий оболочки, но это инструмент 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); }
Comments