Ich habe eine große Integerzahl, z.B.
#!/usr/bin/perl
use strict;
use warnings;
my $number = 0x31fff;
und möchte diese in ein Array der einzelnen Bytes im little endian Format auflösen.
Am Ende möchte ich erhalten:
my @array;
...
<geheimnissvolle Perl-Magie>
...
for (my $i = 0; $i < 8; $i++) {
printf("byte $i: %02x\n", $array[$i]);
}
--------------------------------
$ perl script.pl
byte 0: ff
byte 1: 1f
byte 2: 03
byte 3: 00
byte 4: 00
byte 5: 00
byte 6: 00
byte 7: 00
Die Frage ist also: Wie fülle ich das Array, damit dort drin die im Beispiel gezeigten Werte stehen?
Mein momentaner Ansatz ist eine umständliche modulo / integer-division Bastelei, die spätestens ab 8 Bytes ihre Grenzen hat:
for (my $i = 0; $i < 8; $i++) {
$array[$i] = ( $number % ( 0x100 ** (1 + $i) ) / ( 0x100 ** $i ) );
}
oder per Bitshift ausgedrückt:
for (my $i = 0; $i < 8; $i++) {
$array[$i] = ( $number % ( 0x100 << (8 * $i) ) / ( 0x1 << (8 * $i) ) );
}
In C würde sich sowas vermutlich einfach mit Pointern usw. machen lassen...
Gibt es in Perl z.B. irgendeine pack/unpack Zauberei oder noch einen komplett anderen Ansatz, der sowas bewerkstelligen kann?