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
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.
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.