20.5 Math_BinaryUtils 

Besprochene Version: 0.3.0 | Lizenz: LGPL |
Klassendatei(en): Math/BinaryUtils.php |
Math_BinaryUtils ist eine Klasse, die den Umgang mit binären Zahlen deutlich vereinfacht. Sie stellt Methoden zur Verfügung, um Zahlen in eine binäre Darstellung und zurück zu konvertieren. Darüber hinaus sind auch noch einige Rechenfunktionen definiert. Die Methoden werden alle statisch aufgerufen.
Im Folgenden erläutere ich nur die meiner Ansicht nach wichtigsten Funktionalitäten. Benötigen Sie noch eine Methode, die hier nicht erläutert ist, dann werfen Sie einen Blick in die API-Dokumentation, die Sie unter der URL http://pear.php.net/package/Math_BinaryUtils/docs finden.
Möchten Sie eine Integer-Zahl in die entsprechende binäre Darstellung konvertieren, könnte das so aussehen:
require_once('Math/BinaryUtils.php'); // Zu konvertierende Zahl $int=119266; // Konvertierung und Ausgabe $bin=Math_BinaryUtils::decToBin($int); echo "$int wird binär so dargestellt: $bin"; // Ausgabe: // 119266 wird binär so dargestellt: 11101000111100010
Die Methode liefert also einen normalen String zurück. Möchten Sie eine Fließkommazahl konvertieren, ist das auch möglich. Dazu ist floatToBin() vorgesehen. Auch diese Methode bekommt die zu konvertierende Zahl als Parameter übergeben. Der String, der zurückgegeben wird, kann allerdings nicht direkt ausgegeben werden. Die Daten sind darin binär kodiert enthalten, so dass sie für den Datenaustausch, nicht aber für eine Darstellung auf dem Bildschirm genutzt werden können.
Für die beiden Methoden sind auch Umkehrungen definiert. binToDec() bekommt einen String übergeben, der aus 0 und 1 besteht, konvertiert diesen in eine Integer-Darstellung und gibt die Zahl zurück.
Auch der Methode binToFloat() wird der String, der die binäre Darstellung einer Fließkommazahl enthält, als Parameter übergeben, [Zurzeit muss es sich hierbei um eine Variable handeln. ] und sie liefert eine Fließkommazahl zurück.
Interessant ist auch die Methode binToString(). Diese bekommt einen String aus Nullen und Einsen übergeben, analysiert ihn und gibt den Text zurück, der durch das Bitmuster beschrieben wird.
require_once('Math/BinaryUtils.php'); $bin='100100011100100'; echo (Math_BinaryUtils::binToString($bin)); // Gibt "Hä" aus
Die Konvertierung erfolgt auf Basis des erweiterten ASCII- bzw. ISO-8859–1-Zeichensatzes.
Mit dem Paket können Sie auch das NUXI-Problem recht elegant in den Griff bekommen. Das NUXI-Problem bezeichnet die Problematik, dass Prozessoren unterschiedlicher Hersteller die Bytes in einem Wort unterschiedlich ablegen. Ein Wort besteht aus 16 Bit, also aus 2 Bytes. X86-Prozessoren, wie sie von Intel oder AMD hergestellt werden, nutzen die Little-Endian-Kodierung. In diesem Fall wird das niederwertige Byte an der kleineren Speicheradresse abgelegt. Unter der nächsten Speicheradresse wird dann das höherwertige Byte abgelegt.
Andere Hersteller wie Sun oder IBM nutzen in ihren SPARC- bzw. PPC-Prozessoren die Big-Endian-Kodierung. In diesem Fall werden die Bytes in der umgekehrten Reihenfolge abgelegt. Daraus resultiert auch der Name NUXI-Problem. Der Begriff UNIX kann im Speicher in zwei Worten (UN und IX) abgelegt werden. Vertauschen Sie innerhalb der beiden Worte die Bytes, so erhalten Sie NUXI.
Übernehmen Sie binäre Daten direkt vom Betriebssystem oder von einem anderen Server, so können die unterschiedlichen Formate zu einem Problem werden.
Um herauszufinden, welche Kodierung das System nutzt, auf dem ein Script läuft, können Sie die Methode getNativeOrder() aufrufen. Diese gibt Ihnen entweder die Konstante MATH_BINARYUTILS_BIG_ENDIAN oder die Konstante MATH_BINARYUTILS_LITTLE_ENDIAN zurück, die in der Klasse definiert sind.
Wenn Sie wissen, welche Kodierung vorliegt, können Sie Daten mithilfe der Methoden aus Tabelle 20.3 konvertieren.
Hilfreich kann sicher auch die Methode getHexBytes() sein. Ihr wird ein Wert übergeben, den sie als String interpretiert. Für jedes einzelne Zeichen, das enthalten ist, wird Ihnen dann der ASCII-Code in hexadezimaler Schreibweise zurückgegeben. Der Rückgabewert ist hierbei ein String, bei dem die hexadezimalen Zahlen durch Leerzeichen getrennt sind.