2010-11-08 43 views
5

給定一個字符串$ old_str,我試圖將前N位(不是字節)提取到$ new_str中。我一直在閱讀包文檔和perlpacktut,但我絕望地困惑。這是我目前站:Perl:給定一個任意字符串,如何提取前N位?

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

這將產生:

0b1000 | 0b1001001100101100000001011011101010 

但我想這一點:

0b10010 | 0b1001001100101100000001011011101010 
+1

如果你知道如何獲得一個字符串的位,然後做到這一點,並獲得他們的前五個使用子字符串。你需要哪部分幫助? – AmbroseChapel 2010-11-08 19:32:33

回答

0

你可以使用unpack

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

它將創建80'1(char 0x31s)和'0's(char 0x30s)的字符串。在Windows上,您可能需要添加reverse

0

我不確定你在這裏要做什麼。該unpack("B*", $old_str)創建包含以下位的位串(空間增加了可讀性):

00111001 00111000 00110111 00110110 00110101 00110100 00110011 00110010 00110001 00110000 

...換句話說,對應於ASCII碼爲您的字符位串:

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

然後你做pack('B5', '00111001…')這似乎有點複雜。它看起來像pack返回由第一個8元組(11001)中的5個最右邊位組成的一個字節。這使56或8字符串(因爲對於8 ASCII碼是56):

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

當你printf串,你得到的數字8的二進制數字表示:

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

(這太瘋狂了。)

相關問題