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ď č. 1Chcete 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é.)