Perl: Учитывая произвольную строку, как вы извлекаете первые N бит? - PullRequest
5 голосов
/ 08 ноября 2010

Учитывая строку $ old_str, я пытаюсь извлечь первые N бит (не байтов) в $ new_str.Я читал документацию пакета и perlpacktut, но безнадежно запутался.Вот где я сейчас стою:

my $old_str = "9876543210";                                                     
# 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

Ответы [ 3 ]

1 голос
/ 08 ноября 2010

Вы хотите встроенный vec: vec

0 голосов
/ 08 ноября 2010

Я не уверен, что вы пытаетесь сделать здесь.unpack("B*", $old_str) создает битовую строку, содержащую следующие биты (пробелы, добавленные для удобства чтения):

00111001 00111000 00110111 00110110 00110101 00110100 00110011 00110010 00110001 00110000

… другими словами, битовая строка, соответствующая номерам ASCII для ваших символов:

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

Тогда вы делаете pack('B5', '00111001…'), что кажется немного сложным.Похоже, pack возвращает байт, состоящий из пяти крайних правых бит в первом 8-кортеже (11001).Это дает 56 или строку 8 (поскольку ASCII для 8 равно 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

(Это безумие.)

0 голосов
/ 08 ноября 2010

Вы можете использовать unpack:

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

Это создаст строку из 80 '1 (char 0x31s) и' 0 (char 0x30s).В Windows вам, вероятно, потребуется добавить reverse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...