Thread python nach perl -> pack / unpack
(10 answers)
Opened by egal123 at 2015-12-09 19:41
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) |