2010-11-08 7 views
5

Dada una cadena $ old_str, estoy tratando de extraer los primeros N bits (no bytes) en $ new_str. He estado leyendo la documentación del paquete y perlpacktut, pero estoy desesperadamente confundido. Aquí es donde actualmente me encuentro:Perl: Dada una cadena arbitraria, ¿cómo extraes los primeros N bits?

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; 

Esto produce:

0b1000 | 0b1001001100101100000001011011101010 

Pero yo quiero esto:

0b10010 | 0b1001001100101100000001011011101010 
+1

Si sabe cómo meter los bits en una cadena, hágalo y obtenga los cinco primeros utilizando una subcadena. ¿Con qué parte necesitas ayuda? – AmbroseChapel

Respuesta

0

Usted puede usar unpack:

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

Creará una cadena de 80 '1's (char 0x31s) y' 0's (char 0x30s). En Windows, probablemente necesitará agregar reverse.

0

No estoy seguro de lo que está tratando de hacer aquí. El unpack("B*", $old_str) crea una cadena de bits que contiene los siguientes bits (espacios añadido para facilitar la lectura):

00111001 00111000 00110111 00110110 00110101 00110100 00110011 00110010 00110001 00110000 

... en otras palabras, una cadena de bits que corresponden a los números ASCII para sus personajes:

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

Entonces haces pack('B5', '00111001…') que parece ser un poco complejo. Parece que pack devuelve un byte que consiste en los cinco bits de la derecha en el primer 8-tuple (11001). Eso le da 56 o la cadena 8 (ya que el ASCII para 8 es 56):

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

Y cuando printf la cadena, se obtiene la representación numérica binaria del número 8:

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

(Esto es una locura.)

Cuestiones relacionadas