#1 14.02.2019 16:48:08

Geringdingdingdingdingdin
Gast

Perl: große Integer in einzelne Bytes auflösen (little endian)

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?

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Deine Antwort

Fußzeile des Forums