İkili onaltılık ve ondalık ve viceversa kabuk komut dosyasında dönüştürmek gereken bir bağlam var. Birisi bana bunun için bir araç önerebilir mi?
İkili onaltılık ve ondalık ve viceversa kabuk komut dosyasında dönüştürmek gereken bir bağlam var. Birisi bana bunun için bir araç önerebilir mi?
Yanıtlar:
Oldukça dönüşüm yapmak basittir gelen saf bash ikili ( echo
ve printf
yerleşikleri şunlardır):
$ echo "$((2#101010101))"
341
$ printf '%x\n' "$((2#101010101))"
155
Yalnızca bash kullanarak ikili dosyaya geri dönmek biraz daha karmaşıktır, bu yüzden çözümlerin diğer cevaplarını görmenizi öneririm.
printf '%x\n' 10
Örneğin yapın.
printf %d
Bin2dec için kullanmanın anlamı nedir? $(( ... ))
zaten ondalık bir sonuç verir echo
, yeterlidir.
printf '%s\n' foo
yerine kullanıyorum echo
, aynı nedenden dolayı burada kullanmıyorum.
echo
. Benim hatam!
İkili olarak kabul ederseniz, temel verileri 2 ile değil, 0 dahil olası bayt değerine sahip verilerdeki gibi ifade edersiniz:
Dönüştürmek için gelen ikili, od
(standart), xxd
(birlikte gelir vim
) ya da perl
'ın unpack
akla gelir.
od -An -vtu1 # for decimal
od -An -vtx1 # for hexadecimal
xxd -p # for hexa
perl -pe 'BEGIN{$\="\n";$/=\30};$_=unpack("H*",$_)' # like xxd -p
# for decimal:
perl -ne 'BEGIN{$\="\n";$/=\30;$,=" "}; print unpack("C*",$_)'
Şimdi, ikili, (standart) veya 'lara geri dönüştürmek için :awk
xxd -r
perl
pack
Yukarıdaki od -tu1
veya perl
daha sonraki ondalık çıktıdan :
LC_ALL=C awk '{for (i = 1; i <= NF; i++) printf "%c", $i}'
perl -ape '$_=pack("C*",@F)'
Hexa perl
veya xxd -p
üzeri:
xxd -r -p
perl -pe 'chomp;$_=pack("H*",$_)'
Bunun için bc'yi ibase
ve obase
parametrelerini değiştirerek kullanabilirsiniz :
İşin püf noktası, üsler hakkında açık olmanız gerektiğidir. Eğer ibase değeriniz 2 ise, obazınızı 10 olarak ayarlarsanız, ikili dosyada 10 2 olduğu için hiçbir şey yapmaz. Bu nedenle onaltılı gösterim kullanmanız gerekir.
Yani ikiliden ondalığa kadar olurdu (obazın A olduğunu izleyin)
İkiliden onluya:
$> echo 'ibase=2;obase=A;11110001011010'|bc
15450
İkiliden onaltıya:
$> echo 'ibase=2;obase=10000;11110001011010'|bc
3C5A
obase
Önce 'çıktı tabanı' değiştirilirse, daha kolay olmalıdır:
$> echo 'obase=10;ibase=2;11110001011010'|bc
15450
$> echo 'obase=16;ibase=2;11110001011010'|bc
3C5A
echo 'ibase=2;obase=F;1111
Hangisinin ondalık 15'e eşit olması gerektiğini deneyin , yani. Altıgen F. Taban 15'te (0-E rakamları) olduğu 10 olarak ortaya çıkar. Eğer OBASE devlet durumunda da kolaydır ilk , örneğin: echo 'obase=16;ibase=2;1111'|bc
. Karışıklık yok.
ibase
, bu temelde bile, girdi sağlamanız gerekir obase
. Yani örneğinizde olur echo 'ibase=2;obase=10000;11110001011010'|bc
. Goldilocks'un tavsiyelerini dinlemeniz ve siparişi tersine çevirmeniz daha iyi - ilk önce obase
o zaman ibase
.
Sayıları taban-2'den 10 veya 16'ya ve geri dönüştürmek istiyorsanız, bc
bunu psarossy tarafından daha önce belirtildiği gibi yapmak için standart araçtır .
decimal=123
binary=$(echo "obase=2;$decimal" | bc)
hex=$(echo "obase=16;ibase=2;$binary" | bc)
Gibi bazı kabuklar zsh
, aritmetik genişletme operatörlerinin bir parçası olarak taban dönüşümü için yerleşik desteğe sahiptir:
decimal=123
binary=$(([##2]decimal))
hex=$(([##16]decimal))
hex=$(([##16]2#$binary))
decimal=$((2#$binary))
ve bunun gibi.
Hem ksh93
ve zsh
ayrıca destek:
typeset -i2 binary=123
typeset -i16 dec2hex=123 bin2hex='2#1111'
Ancak, genişletildiğinde, $binary
bir 2#
veya 16#
önekinin (ile şeritleyebileceğiniz) olacağını unutmayın ${binary#*#}
.
ksh93
ayrıca destekler:
printf "%..2d\n" 123
ikiliye dönüştürmek.
Onaltılık kullanımına ikili için: XXD linux aracı ve qalculate aracını kullanabilirsiniz onluya ikili için.
Xxd türü xxd --help
veya man xxd
Linux ile ilgili yardım için .
PHP'yi kullanabilirsiniz:
$ php -r 'printf("%b", 11);'
1011
Veya Perl:
$ perl -e 'print unpack("B*", pack("c", 11))'
00001011
$ perl -e 'print unpack("B*", pack("C", 11))'
00001011
$ perl -e 'print unpack("B*", pack("W", 11))'
00001011
$ perl -e 'print unpack("B*", pack("n", 11))'
0000000000001011
$ perl -e 'print unpack("B*", pack("N", 11))'
00000000000000000000000000001011
Veya POSIX Awk svnpenn / stdlib :
$ awklib 'BEGIN {print mt_basecon(1011, 2, 16)}'
B
$ awklib 'BEGIN {print mt_basecon(1011, 2, 10)}'
11
$ awklib 'BEGIN {print mt_basecon("B", 16, 2)}'
1011
$ awklib 'BEGIN {print mt_basecon(11, 10, 2)}'
1011
Önceki yanıtta belirtildiği gibi, Bash'de echo ve printf kullanarak Binary to Decimal ve Hexa Decimal'ı aşağıdaki gibi yapabilirsiniz. Ben sadece saf Bash kullanarak Ondalık ve Hex ikili dönüştürmek nasıl ekliyorum.
Echo kullanarak İkili - Ondalık
echo "$((2#101010101))"
341
Printf kullanarak İkili-Hexa-Ondalık
printf '%x\n' "$((2#101010101))"
155
Yalnızca Bash kullanarak tam sayı ondalıktan İkili dönüşüme
Ondalık değeri ikiliye dönüştürmek istiyorsanız, yalnızca Bash kullanarak aşağıdaki gibi yapabilirsiniz:
touch dec2bin && chmod +x "$_" && vim "$_"
Ardından aşağıdakileri kopyalayıp yapıştırın:
#!/bin/bash
## converting decimal integer to binary, pass int as a parameter
num=$1;
dec2bin()
{ [ "$num" == "" ] && { printf "Error: Pass an integer\n"; exit 1; };
op=2; ## Since we're converting to binary
quo=$(( $num / $op)); rem=$(( $num % $op)); ## quotient and remainder
remarray=(); ## array for putting remainder inside array
remarray+=("$rem"); ## array expansion
until [[ $quo -eq 0 ]]; do
num=$quo; quo=$(( $num / $op)); ## looping to get all remainder untill 0
rem=$(( $num % $op)); remarray+="$rem"; ## array expansion
done
binary=$(echo "${remarray[@]}" | rev); ## reversing array
printf "$binary\n"; ## printing reversed array
}
main()
{ [[ -n ${num//[0-9]/} ]] &&
{ printf "Error: $num is not an integer bruv!\n"; return 1;
} || { dec2bin $num; }
}
main;
Sonra kaydettiğiniz yerden deneyin:
./dec2bin 420
110100100
Tam sayı eklenmelidir !!
./dec2bin 420.py
420.py is not an integer bruv!
Yalnızca Bash kullanarak onaltılıktan İkili dönüşüme
Benzer şekilde, sadece bash kullanılarak aşağıdaki gibi onaltılıdan ikiliye:
#!/usr/local/bin/bash
## converting hexadecimal to binary, pass hex as a parameter
hex=$1;
hex2bin()
{ [ "$hex" == "" ] && { printf "Error: Pass a hex\n"; exit 1; };
op=2; num=$((16#$hex)); ## converting hex to integer
quo=$(( $num/ $op)); rem=$(( $num% $op)); ## quotient and remainder
remarray=(); remarray+=("$rem"); ## array expansion
until [[ $quo -eq 0 ]]; do
num=$quo; quo=$(( $num / $op)); ## looping to get all remainder untill 0
rem=$(( $num % $op)); remarray+="$rem"; ## array expansion
done
binary=$(echo "${remarray[@]}" | rev); ## reversing array
printf "$binary\n"; ## printing reversed array
}
main()
{
[[ -n ${hex//[0-9,A-F,a-f]/} ]] &&
{ printf "Error: $hex is not a hex bruv!\n"; return 1;
} || { hex2bin $hex; }
}
main;
Örneğin:
./hex2bin 1aF
110101111
Onaltılı geçilmelidir:
./hex2bin.bash XyZ
XyZ is not a hexa decimal number bruv!