Thread python nach perl -> pack / unpack (10 answers)
Opened by egal123 at 2015-12-09 19:41

hlubenow
 2015-12-09 23:08
#183197 #183197
User since
2009-02-22
875 Artikel
BenutzerIn
[default_avatar]
Gut. Ich benutze pack() und unpack() außerordentlich ungern und kenne mich damit daher nicht besonders gut aus.

Den Python-Teil habe ich aber, glaube ich, einigermaßen verstanden. Dieses:
Code (python): (dl )
bits = pack('uint:5, uint:1, uint:10, uint:8', 2, 0, 64, 2)

erzeugt einen Bitstream. 5 + 1 + 10 + 8 = 24. Insgesamt bekommt der Stream also 24 Bits. Am Ende "uint:8" -> 2 bedeutet also, die Zahl 2 wird in 8 Bits umgewandelt. Aus der 2 wird also "00000010", das dürfte man dann also am Ende des Bitstreams finden. Dieses
Code (python): (dl )
byte1, byte2, byte3 = bits.unpack('bytes:1,bytes:1,bytes:1')

bedeutet, die 24 Bits des Bitstreams werden in 3 Bytes aufgeteilt. Diese 3 Bytes werden den String-Variablen byte1, byte2 und byte3 zugewiesen (mit ord() bekäme man die Zahlenwerte). Man hätte auch gleich
Code (python): (dl )
listOfBytes = bits.unpack('bytes:1,bytes:1,bytes:1')

schreiben können, wenn man die Werte in einer Liste hätte haben wollen.

Es werden also 4 (Integer-)Zahlen in 24 Bits umgewandelt. Diese 24 Bits werden dann auf 3 Bytes, bzw. 3 ASCII-Zeichen verteilt (24 Bits / 8 Bits pro Byte = 3 Bytes).

Wie man dasselbe mit pack() und unpack() in Perl macht, sollte vielleicht jemand anders beschreiben. Die Umwandlung in 24 Bits würde ich z.B. so machen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl

use warnings;
use strict;

my @v = qw(2 0 64 2);
my @l = qw(5 1 10 8);
my $i;

my $bits = "";

for ($i=0; $i<=$#v; $i++) {
    my $s = "%0" . $l[$i] ."b";
    $bits .= sprintf("$s", $v[$i]);
}
print "$bits\n";

Last edited: 2015-12-09 23:14:08 +0100 (CET)

View full thread python nach perl -> pack / unpack