Beispiele

Binärdaten in Hex umzuwandeln und mit Bitmanipulationen aus einem A aus einem C zu machen, ist sicher unterhaltsam, aber welchen Nutzen haben solche Funktionen in der realen Welt? Im Folgenden geben wir einige Beispiele dafür, angefangen bei der Umwandlung von ASCII in Unicode. ASCII ist ein 8-Bit-Zeichensatz, während Unicode mindestens 16 Bits verwendet. ASCII in Unicode umzuwandeln ist ziemlich einfach, da bei der Erfindung der Unicode-Standards auf Rückwärtskompatibilität geachtet wurde. Es genügt, vor jeden ASCII-Wert eine 0 zu hängen, um daraus den entsprechenden Unicode-Character mit 16 Bit zu machen (Listing 3).

Listing 3: ASCII zu Unicode

ascii2unicode() {
  echo "$1" | sed 's/\(.\)/\1\n/g' | awk '/^.$/{ printf("%c%c",0,$0) }'
}
$ ascii2unicode jello
jello

Bei der Ausgabe ist hier kein Unterschied auszumachen. Um die hinter den Zeichen stehenden Daten sichtbar zu machen, übergeben Sie das Resultat an xxd:

ascii2unicode jello | xxd
0000000: 006a 0065 006c 006c 006f      .j.e.l.l.o

Hier sieht man, dass die ASCII-Zeichen um ein führendes "00" erweitert wurden. Die Umwandlung in Listing 3 funktioniert so: Die Ausgabe des echo-Kommandos wird an sed übergeben, das jeden Wert in einer eigenen Zeile ausgibt. Diese Zeilen liest awk und fügt jeweils am Anfang ein 0 ein, wenn es nur ein Zeichen ist.

Ein weiteres Beispiel ist das Encoden von URLs, in denen "Sonderzeichen" oder andere Zeichen mit einem Prozentzeichen gefolgt von einer Hexzahl codiert sein können. Ein URL-encodierter String wie "%61%62%63" wird beim Decodieren zu "abc". Die Funktion in Listing 4 nutzt dazu die Standardfunktionalität von xxd. Beim Encoden wird die Eingabe in 1-Byte-Segmente zerlegt, vor die der sed-Befehl jeweils ein Prozentzeichen setzt. Beim Decoden werden die Prozentzeichen entfernt und das Resultat an xxd übergeben.

Listing 4: URL-Encoding

urlencode() {
  echo -n "$1" | xxd -p | tr -d '\n' | sed 's/\(..\)/%\1/g'
}
urldecode() {
  tr -d '%' <<< "$1" | xxd -r -p
}
$ urlencode name
%6e%61%6d%65
$urldecode %64%6f%6e%65
done

Subnetzmasken

In IP-Netzen legt die Subnetzmaske fest, wieviele Bits das Netzwerk kennzeichnen und wieviele den Host identifizieren. Die Größe des IP-Host-Adressbereichs bestimmt, wieviele Hosts es in dem Netz geben kann. Listing 5 zeigt, wie man die Subnetzmaske in einen Binärstring umwandelt und die Netzgröße bestimmt.

Listing 5: Subnetzmasken

 subnetcalc() {
   echo -n "$1" | \
   awk 'BEGIN { FS="." ; printf("obase=2;ibase=A;") } { printf("%s;%s;%s;%s;\n",$1,$2,$3,$4) }' |
   bc | sed 's/^0$/00000000/g;s/\(.\)/\1\n/g' | \
   awk 'BEGIN { ht = 0; nt = 0; }
        /[01]/ { if ($0=="1") nt++; if ($0=="0") ht++; }
        END { printf("Network bits: %s\nHost bits: %s\nHost IP Count: %d\n",nt,ht,2^ht); }'
 }
$ subnetcalc 255.255.192.0
Network bits: 18
Host bits: 14
Host IP Count: 16384

Wie man sieht, lassen sich mit Bash und Co. Binärdaten einfach verarbeiten. Als hilfreich erweisen sich dabei vor allem die Tools xxd und bc, die Ein- und Ausgabedaten wandeln und mit ihnen unterschiedliche Berechnungen anstellen können.

Ähnliche Artikel

comments powered by Disqus
Mehr zum Thema

ADMIN-Tipp: Find-Tutorial (2)

Nachdem der erste Teil des Find-Tutorial die Basics des Programms erklärt hat, soll es dieses Mal darum gehen, wie man die gefundenen Dateien weiterverarbeiten kann.

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2019