Typed Arrays in JavaScript gehen auch mit Perl zu machen
Betrachte untenstehenden Code in JavaScript:
buffer = new ArrayBuffer(1028); dav = new DataView(buffer); dav.getUint32(0);
Genau dasselbe können wir auch mit Perl machen. Man nehme eine beliebige Bytesequenz und erzeuge damit ein Uint8Array
was gleichermaßen quasi ein DataView
-Objekt ist. Untenstehend eine einfache Klasse welche die beiden Methoden getUint32
und getUint16
implementiert:
package DataView; use strict; use warnings; sub new{ my $class = shift; my $binary = shift; return eval{ die "No Binary given!\n" unless $binary; my $self = bless[unpack 'C*', $binary], $class; }; } sub getUint16{ my $self = shift; my $offs = shift; my $LE = shift; my $bin = pack "CC", $self->[$offs], $self->[$offs+1]; return $LE ? unpack("v", $bin) : unpack("n", $bin); } sub getUint32{ my $self = shift; my $offs = shift; my $LE = shift; my $bin = pack "CCCC", $self->[$offs], $self->[$offs+1], $self->[$offs+2], $self->[$offs+3]; return $LE ? unpack("V", $bin) : unpack("N", $bin); } sub getString{ my $self = shift; my $offs = shift; my $len = shift; return pack "C*", map{$self->[$_]} ($offs..$offs+$len-1); } ## Anwendung: my $dav = DataView->new($binary); print $dav->getUint32(0,1); # Little Endian
In Perl ist eine Klasseninstanz eine Referenz die mit dem Namen einer Klasse gesegnet ist. In der Regel ist diese Referenz eine Hash-Referenz, in der oben vorgestellten Klasse jedoch ist es eine Array-Referenz. Infolge der Segnung dieser Array-Referenz mit einem Klassennamen weiß diese Referenz zu welcher Klasse sie gehört und kann damit die in der Klasse definierten Methoden ausführen.
Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. sos@rolfrost.de.