/ / Perl: Vzhľadom na ľubovoľný reťazec, ako extrahujete prvých N bitov? - perl

Perl: Vzhľadom na ľubovoľný reťazec, ako extrahujete prvé N bity? - perl

Vzhľadom na reťazec $ old_str sa snažím extrahovaťprvých N bitov (nie bajtov) do $ new_str. Čítal som dokumentáciu balíka a program perlpacktut, ale som beznádejne zmätený. Na tomto mieste momentálne stojím:

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;

To prináša:

0b1000 | 0b1001001100101100000001011011101010

Ale chcem toto:

0b10010 | 0b1001001100101100000001011011101010

odpovede:

1 pre odpoveď č. 1

Chcete mať zabudovanú vec: vec


0 pre odpoveď č. 2

Môžeš použiť unpack:

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

Vytvorí reťazec 80 "1" s (char 0x31s) a "0" s (char 0x30s). Vo Windows budete pravdepodobne musieť pridať reverse.


0 pre odpoveď č. 3

Nie som si istý, čo sa tu snažíte urobiť. The unpack("B*", $old_str) vytvorí bitový reťazec obsahujúci nasledujúce bity (medzery pridané kvôli čitateľnosti):

00111001 00111000 00110111 00110110 00110101 00110100 00110011 00110010 00110001 00110000

... inými slovami, bitový reťazec zodpovedajúci číslam ASCII pre vaše znaky:

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

Potom to urobíte pack("B5", "00111001…") čo sa javí ako trochu zložité. Vyzerá to ako pack vráti bajt pozostávajúci z piatich bitov úplne vpravo v prvej 8-tici (11001). To dáva 56 alebo 8 reťazec (od ASCII pre 8 je 56):

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

A keď vy printf reťazec, získate binárne číselné vyjadrenie čísla 8:

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

(To je šialené.)