Ich habe einen Kontext, in dem ich binär in hexadezimal und dezimal und umgekehrt in einem Shell-Skript konvertieren muss. Kann mir jemand ein Tool dafür vorschlagen?
Ich habe einen Kontext, in dem ich binär in hexadezimal und dezimal und umgekehrt in einem Shell-Skript konvertieren muss. Kann mir jemand ein Tool dafür vorschlagen?
Antworten:
Es ist ziemlich einfach, die Konvertierung von Binary in Pure Bash ( echo
und printf
Builtins) durchzuführen:
$ echo "$((2#101010101))"
341
$ printf '%x\n' "$((2#101010101))"
155
Es ist etwas komplexer, mit bash allein zur Binärdatei zurückzukehren. Ich schlage vor, Sie sehen die anderen Antworten für Lösungen dafür.
printf '%x\n' 10
, zum Beispiel.
printf %d
bin2dec? $(( ... ))
gibt schon ein dezimales ergebnis aus, echo
reicht.
printf '%s\n' foo
statt aus echo
verschiedenen Gründen (meistens Portabilität), aus dem gleichen Grund verwende ich es hier nicht.
echo
Funktion hat). Mein Fehler!
Angenommen, mit binär meinen Sie binäre Daten wie in Daten mit einem möglichen Bytewert einschließlich 0 und nicht Basis-2-Zahlen:
Zum Konvertieren von binären, od
(Standard), xxd
(kommt mit vim
) oder perl
‚s unpack
in den Sinn kommen.
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*",$_)'
Nun, zu konvertieren zurück zu binär, awk
(Standard), xxd -r
oder perl
‚s pack
:
Aus der dezimalen Ausgabe von od -tu1
oder perl
über:
LC_ALL=C awk '{for (i = 1; i <= NF; i++) printf "%c", $i}'
perl -ape '$_=pack("C*",@F)'
Aus dem Hexa perl
oder xxd -p
höher:
xxd -r -p
perl -pe 'chomp;$_=pack("H*",$_)'
Sie können bc dafür verwenden, indem Sie die Parameter ibase
und obase
ändern:
Der Trick ist, dass Sie über die Grundlagen explizit sein müssen. Wenn Ihre ibase 2 ist, dann wenn Sie Ihre obase auf 10 setzen, wird es nichts tun, da 10 in der Binärzahl 2 ist. Daher müssen Sie hexadezimale Notation verwenden.
Also binär zu dezimal wäre (achte darauf, dass obase A ist)
Binär zu Dezimal:
$> echo 'ibase=2;obase=A;11110001011010'|bc
15450
Binär zu Hex:
$> echo 'ibase=2;obase=10000;11110001011010'|bc
3C5A
Wenn die Ausgabebasis obase
zuerst geändert wird, sollte es einfacher sein:
$> echo 'obase=10;ibase=2;11110001011010'|bc
15450
$> echo 'obase=16;ibase=2;11110001011010'|bc
3C5A
echo 'ibase=2;obase=F;1111
die sollte dezimal 15, also gleich. F in hex. Es wird als 10 ausgegeben, was der Basis 15 entspricht (Ziffern 0-E). Es ist auch einfacher , wenn Sie die obase angeben ersten , zum Beispiel: echo 'obase=16;ibase=2;1111'|bc
. Keine Verwirrung.
ibase
, müssen Sie in dieser Basis Eingaben vornehmen, auch für obase
. Also in deinem Beispiel wäre echo 'ibase=2;obase=10000;11110001011010'|bc
. Höre besser auf den Rat von Goldlöckchen und kehre die Reihenfolge um - erst einstellen obase
, dann ibase
.
Wenn Sie Zahlen von der Basis 2 in 10 oder 16 und zurück konvertieren möchten , bc
ist dies das Standardwerkzeug, das bereits von psarossy erwähnt wurde .
decimal=123
binary=$(echo "obase=2;$decimal" | bc)
hex=$(echo "obase=16;ibase=2;$binary" | bc)
Einige Shells wie zsh
haben als Teil ihrer arithmetischen Expansionsoperatoren eine eingebaute Unterstützung für die Basiskonvertierung:
decimal=123
binary=$(([##2]decimal))
hex=$(([##16]decimal))
hex=$(([##16]2#$binary))
decimal=$((2#$binary))
und so weiter.
Beides ksh93
und zsh
auch Unterstützung:
typeset -i2 binary=123
typeset -i16 dec2hex=123 bin2hex='2#1111'
Beachten Sie jedoch, dass beim Erweitern $binary
ein 2#
oder ein 16#
Präfix (mit dem Sie den Strip ausführen können) angezeigt wird ${binary#*#}
.
ksh93
unterstützt auch:
printf "%..2d\n" 123
zu binär konvertieren.
Für die Verwendung von Binär zu Hexadezimal: Das xxd- Tool unter Linux und für die Verwendung von Binär zu Dezimal können Sie das qalculate-Tool verwenden.
Hilfe zu xxd type xxd --help
oder man xxd
unter Linux.
Sie können PHP verwenden:
$ php -r 'printf("%b", 11);'
1011
Oder 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
Oder 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
Wie in der vorherigen Antwort erwähnt, können Sie in Bash unter Verwendung von echo und printf Binär zu Dezimal und Hexadezimal wie folgt vorgehen. Ich füge hier nur hinzu, wie man mit Pure Bash von Dezimal und Hex zu Binär konvertiert.
Binär zu Dezimal mit Echo
echo "$((2#101010101))"
341
Binär zu Hexa-Dezimal mit printf
printf '%x\n' "$((2#101010101))"
155
Ganzzahlige Dezimal-Binär-Konvertierung, bei der nur Bash verwendet wird
Wenn Sie nur Bash verwenden und Dezimalzahlen in Binärzahlen konvertieren möchten, können Sie dies folgendermaßen tun:
touch dec2bin && chmod +x "$_" && vim "$_"
Kopieren Sie anschließend Folgendes, und fügen Sie es ein:
#!/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;
Und dann probieren Sie es aus, wo Sie gespeichert haben:
./dec2bin 420
110100100
Ganzzahl muss hinzugefügt werden !!
./dec2bin 420.py
420.py is not an integer bruv!
Hexadezimal-Binär-Konvertierung nur mit Bash
In ähnlicher Weise hexadezimal zu binär, wie folgt, wenn nur bash verwendet wird:
#!/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;
Beispielsweise:
./hex2bin 1aF
110101111
Verhexung muss übergeben werden:
./hex2bin.bash XyZ
XyZ is not a hexa decimal number bruv!