Thread Große Integer in einzelne Bytes auflösen (13 answers)
Opened by zuse1 at 2019-02-15 11:50

zuse1
 2019-02-15 11:50
#189785 #189785
User since
2019-02-15
5 Artikel
BenutzerIn
[default_avatar]
Ich habe eine große Integerzahl, z.B.
Code: (dl )
1
2
3
4
5
6
#!/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:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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:
Code: (dl )
1
2
3
for (my $i = 0; $i < 8; $i++) {
$array[$i] = ( $number % ( 0x100 ** (1 + $i) ) / ( 0x100 ** $i ) );
}

oder per Bitshift ausgedrückt:
Code: (dl )
1
2
3
for (my $i = 0; $i < 8; $i++) {
$array[$i] = ( $number % ( 0x100 << (8 * $i) ) / ( 0x1 << (8 * $i) ) );
}

In C würde müsste ich für sowas nur Pointer verschieben, wenn ich mich recht entsinne...
Gibt es in Perl z.B. irgendeine pack/unpack Zauberei oder noch einen komplett anderen Ansatz, der sowas bewerkstelligen kann?
Last edited: 2019-02-15 12:35:01 +0100 (CET)

View full thread Große Integer in einzelne Bytes auflösen