/ / Perl: Wie erhalten Sie eine beliebige Zeichenkette, wie extrahieren Sie die ersten N Bits? - Perl

Perl: Wie erhalten Sie eine beliebige Zeichenfolge? Wie extrahieren Sie die ersten N Bits? - Perl

Gegeben eine Zeichenfolge $ old_str, versuche ich zu extrahierendie ersten N Bits (nicht Bytes) in $ new_str. Ich habe die Packungsdokumentation und perlpacktut gelesen, bin aber hoffnungslos verwirrt. Hier stehe ich derzeit:

my $old_str = "9876543210";
# Extract the first 5 bits
my $new_str = pack("B5", unpack("B*", $old_str));
printf "%#b | %#bn", $new_str, $old_str;

Dies produziert:

0b1000 | 0b1001001100101100000001011011101010

Aber ich will das:

0b10010 | 0b1001001100101100000001011011101010

Antworten:

1 für die Antwort № 1

Sie möchten das integrierte Vec: vec


0 für die Antwort № 2

Sie können verwenden unpack:

my $bit_string = unpack( "b*", $old_str );

Es wird eine Folge von 80 "1" s (char 0x31s) und "0" s (char 0x30s) erzeugt. Unter Windows müssen Sie wahrscheinlich hinzufügen reverse.


0 für die Antwort № 3

Ich bin mir nicht sicher, was du hier machen willst. Das unpack("B*", $old_str) erstellt eine Bit-Zeichenfolge, die die folgenden Bits enthält (Leerzeichen, die zur besseren Lesbarkeit hinzugefügt wurden):

00111001 00111000 00110111 00110110 00110101 00110100 00110011 00110010 00110001 00110000

... mit anderen Worten, eine Bitfolge, die den ASCII-Zahlen für Ihre Zeichen entspricht:

$ perl -E "printf("%#b ", ord) for split(//, "9876543210")"
0b111001 0b111000 0b110111 0b110110 0b110101 0b110100 0b110011 0b110010 0b110001 0b110000

Dann tust du es pack("B5", "00111001…") das scheint ein bisschen komplex zu sein. Es sieht aus wie pack gibt ein Byte zurück, das aus den fünf rechten Bits im ersten 8-Tupel besteht (11001). Das gibt 56 oder die 8 string (seit dem ASCII für 8 ist 56):

$ perl -E "say ord pack("B5", "00111001…")"
56
$ perl -E "say pack("B5", "00111001…")"
8

Und wenn Sie printf die Zeichenfolge, erhalten Sie die binäre numerische Darstellung der Zahl 8:

$ perl -E "say printf "%#b", "8""
0b10001

(Das ist verrückt.)