Über Zahlen und Zeichen

Computer sind dumm. Sie verstehen nur 0en und 1en. Das dafür aber ziemlich schnell.

Ich hab in den letzten Artikel zu Perl ja einiges von Datentypen besprochen. Von daher möchte ich heute ein paar von ihnen angehen.

Explaining bytes
Explaining bytes von
molly steenson (CC BY-NC-SA)

Was ist ein Datentyp?

Nun, ein Datentyp gibt dem Computer Hinweise darüber, wie er eine Folge von 0en und 1en zu interpretieren hat. Im Prinzip sagen wir ihm damit: Das ist eine Zahl. Oder: Das ist eine Folge von Zeichen (ein „String“).

Darüberhinaus kann er einige Regeln aus dem Datentyp ableiten. So kann man mit Zahlen rechnen und Zeichen lassen sich zu Wörtern, Sätzen oder Absätzen zusammenfügen, sowie durchsuchen. Daneben gibt es noch viel mehr Möglichkeiten.

Ich möchte hier aber auch aufzeigen, wie eine Benutzer-Eingabe verschieden dargestellt werden kann.

Genauer gesagt hab ich ein kleines Script geschrieben, was eine Eingabe in binäre, dezimale und hexadezimale Darstellung umrechnet. Oktal wäre eigentlich auch noch ganz nett gewesen. Zu meinen Verbesserungswünschen aber am Ende des Artikels 😉

Ich bin noch einmal zum ersten Artikel bezüglich PerlLernen zurückgegangen. Und dabei auf „Bits and Bytes“ gestoßen. Bits und Bytes können wir 🙂
Siehe auch die Graphik oben.

Für eine dezimale Darstellung ziehe ich die ASCII-Tabelle heran (so eine hab ich noch in meinem Tafelwerk :-)) – zu meinem Erstaunen kann Perl aber auch mit Umlauten und Sonderzeichen umgehen O: Das sollte eigentlich nicht gehen, weil die Tabelle begrenzt ist.
Jetzt muss ich nur die Werte interpretieren lernen …

In der Tabelle sind auch die Hex-Umrechnungen der entsprechenden Werte abzulesen. Binär ist dann ein Gimmick von mir. Die 0 und 1 ist dann, was ganz am Ende bei der CPU ankommt. Sprich, womit der Computer am Ende arbeitet.

Problem: Die Eingabe kann aus mehreren Zeichen bestehen, eine sogenannte Zeichenkette bilden. Die Umwandlung benötigt aber immer genau ein Argument. Zum Glück hat Perl vorgesorgt. Es gibt da eine Funktion namens unpack. Die nimmt ein Template und einen String entgegen und liefert ein Array zurück. Templates sind Vorlagen, in diesem Falle also Blaupausen, wie Perl die Eingabe verarbeiten soll. In anderen Programmiersprache werden Arrays auch Vektoren oder Listen genannt. Das Template wird für jedes einzelne Zeichen angewendet.

Ich zeig das am besten an einem Beispiel:

use 5.010;
use strict;
use warnings;

say "Gib etwas ein! (Drücke <Enter> zum beenden)";
while (my $text = <STDIN>) {
    chomp($text); # Remove newline
    last if ($text eq ''); # If empty, end the program

    # see also: http://perldoc.perl.org/functions/pack.html
    my @binary=unpack "b*", $text;
    my @dec=unpack "C*", $text;
    my @hex=unpack "h*", $text;

    say "Deine Eingabe '$text'";
    say "In binär: @binary";
    say "In dezimal: @dec";
    say "Und in hexadezimal: @hex";
}

In den mittleren Zeilen findet sich immer wieder der gleiche Aufbau: my @foo=unpack "bar*", $text. Das @ bei foo sagt Perl, dass hier ein Array vorliegt. Für „test“ sehen die Einträge bspw. so aus: „t“, „e“, „s“, „t“. Jeder Buchstabe ein Wert.

Der Buchstabe vor dem * sagt unpack, was es mit $text anstellen soll. Die Bedeutung muss unter dem Template-Link oben nachgeschlagen werden (b für Binär, h für Hex, c für Character, also Zeichen).

Das * selbst steht für „nimm so viele Zeichen wie das Argument lang ist„. Wobei mit Argument der Wert in $text gemeint ist. Hier kann auch eine feste Zahl angegeben werden (probiert’s aus! ;-)).

Danke an Dorothee für das Erwähnen von say! Im Prinzip tut es nicht viel anderes als print. Nur dass es sich um Zeilenvorschub für mich kümmert. Apropos Zeilenvorschub. Wem ist das chomp aufgefallen? Auch das findet sich im Artikel von Dorothee. Ich benötige es hier, um nicht-druckbare Zeichen aus der Eingabe zu entfernen (insbesondere das Zeichen für Enter …).

Ich bin noch nicht ganz zufrieden mit dem Code. Zum einen vermisse ich – wie eingangs erwähnt – eine oktale Repräsentation, zum anderen wären Leerzeichen bei binär und hex hilfreich. Ansonsten sind die Zeichen echt mies zu lesen. Hat da jemand eine Idee? 🙂

P.S.: Mist! Ich kam nicht dazu, den Artikel vor Ostern noch einmal durchzugehen. Dabei liegt er schon seit einem Monat hier rum :-/ Tut mir Leid, Dorothee!

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s