Mam kontekst, w którym muszę przekonwertować dane binarne na szesnastkowe i dziesiętne oraz odwrotnie w skrypcie powłoki. Czy ktoś może zasugerować mi narzędzie do tego?
shell-script
binary
arithmetic
Bangi
źródło
źródło
Odpowiedzi:
Konwersja z pliku binarnego w czystym bashu (
echo
iprintf
są wbudowane) jest dość prosta :Binarny na dziesiętny
Binarny na szesnastkowy
Powrót do binarnego korzystania z samego basha jest nieco bardziej złożony, więc sugeruję, abyś zobaczył inne odpowiedzi na rozwiązania tego problemu.
źródło
printf '%x\n' 10
, na przykład.printf %d
bin2dec?$(( ... ))
już daje wynik dziesiętny,echo
wystarczy.printf '%s\n' foo
zamiast zecho
różnych powodów (głównie przenośności), z tego samego powodu nie używam go tutaj.echo
wbudowaną wersję). Mój błąd!Zakładając, że przez binarne, rozumiesz dane binarne jak w danych z dowolną możliwą wartością bajtu, w tym 0, a nie liczbami podstawowymi 2:
Aby przekonwertować z binarnym,
od
(standard),xxd
(wyposażonyvim
) lubperl
„sunpack
przyjść do głowy.Teraz, aby przekonwertować z powrotem na binarne
awk
(standardowe)xxd -r
lubperl
'spack
:Z wyniku dziesiętnego z
od -tu1
lubperl
powyżej:Od hexa
perl
lubxxd -p
wyżej:źródło
Możesz użyć do tego bc, manipulując parametrami
ibase
iobase
:Sztuka polega na tym, że musisz wyraźnie mówić o bazach. Więc jeśli twój ibase ma wartość 2, to jeśli ustawisz obase na 10, nic to nie da, ponieważ 10 w systemie binarnym wynosi 2. Dlatego musisz użyć notacji szesnastkowej.
Więc binarny na dziesiętny będzie (patrz, że obase to A)
Binarny na dziesiętny:
Binarny na hex:
Jeśli
obase
najpierw zmieni się „podstawa wyjściowa” , powinno być łatwiej:źródło
echo 'ibase=2;obase=F;1111
który powinien być równy 15 po przecinku, tj. F na heksie Wychodzi jako 10, która znajduje się w podstawie 15 (cyfry 0-E). Łatwiej jest również, jeśli podać obase pierwszy , npecho 'obase=16;ibase=2;1111'|bc
. Bez zamieszania.ibase
musisz podać dane wejściowe w tej bazie, nawet dlaobase
. W twoim przykładzie byłobyecho 'ibase=2;obase=10000;11110001011010'|bc
. Lepiej słuchać rad Złotowłosa i odwrócić kolejność - najpierw ustawićobase
, a następnieibase
.Jeśli masz na myśli konwersję liczb z base-2 na 10 lub 16 i odwrotnie,
bc
to standardowe narzędzie do robienia tego, jak już wspomniano w psarossy .Niektóre powłoki
zsh
mają wbudowaną obsługę konwersji bazowej w ramach arytmetycznych operatorów ekspansji:i tak dalej.
Zarówno
ksh93
izsh
wsparcie:Pamiętaj jednak, że po rozwinięciu
$binary
będzie miał prefiks2#
lub16#
(za pomocą którego można usunąć${binary#*#}
.ksh93
obsługuje również:przekonwertować na binarny.
źródło
Do użycia binarnego do szesnastkowego: narzędzie xxd w systemie Linux, a do binarnego do dziesiętnego można użyć narzędzia qalculate.
Aby uzyskać pomoc dotyczącą typu xxd
xxd --help
lubman xxd
w systemie Linux.źródło
Możesz użyć PHP:
Lub Perl:
Lub POSIX Awk svnpenn / stdlib :
źródło
Jak wspomniano w poprzedniej odpowiedzi, w Bash można wykonać Binary to Decimal i Hexa Decimal w następujący sposób, używając echa i printf. Właśnie dodam tutaj, jak przekonwertować z Decimal i Hex na binarne przy użyciu czystego Basha.
Binarny na dziesiętny za pomocą echa
Binarny do szesnastkowego za pomocą printf
Przeliczanie liczb całkowitych na dziesiętne na binarne przy użyciu tylko Bash
Używając tylko Bash, jeśli chcesz przekonwertować liczbę dziesiętną na binarną, możesz to zrobić w następujący sposób:
A następnie skopiuj i wklej następujące elementy:
A następnie wypróbuj to, skąd zapisałeś:
Liczba całkowita musi być dodana !!
Konwersja szesnastkowa na binarną przy użyciu tylko Bash
Podobnie, w systemie szesnastkowym lub binarnym, używając tylko bash:
Na przykład:
Hex należy przekazać:
źródło