Pregunta

Tengo algunas cadenas de caracteres de 256 caracteres hexadecimales que representan una secuencia de indicadores de bits, y estoy tratando de convertirlos de nuevo en una cadena de bits para que pueda manipularlos con &, |, vec y similares. Las cuerdas hexagonales están escritas en grupos big-endian-amplia enteros, de tal manera que un grupo de 8 bytes como "76543210" debe traducir a la cadena de bits "\x10\x32\x54\x76", es decir, los 8 bits más bajos son 00001000.

El problema es que el formato pack 's 'h' trabaja en un byte de entrada a la vez, en lugar de 8, por lo que los resultados de sólo usarla directamente no estará en el orden correcto. En el momento que estoy haciendo esto:

my $bits = pack("h*", join("", map { scalar reverse $_ } unpack("(A8)*", $hex)));

que funciona, pero se siente hacker. Parece que debe haber una forma más limpia, pero mi <=> - fu no es muy fuerte. ¿Hay una mejor manera de hacer esto traducción?

¿Fue útil?

Solución

my $hex = "7654321076543210";  # can be as long as needed
my $bits = pack("V*", unpack("N*", pack("H*", $hex)));
print unpack("H*", $bits);  #: 1032547610325476

Otros consejos

Considere el uso de las excelentes href="http://search.cpan.org/perldoc?Bit::Vector" Bit :: Vector.

Utilice la función hexagonal convertir la cadena hexadecimal en una representación interna de Perl de la número, realice sus operaciones bit a bit, y el uso de sprintf para convertirla de nuevo en la cadena hexadecimal :

#!/usr/bin/perl

use strict;
use warnings;

my $hex = "76543210";
my $num = hex $hex;

$num &= 0xFFFF00FF; # Turn off the third byte

my $new_hex = sprintf("%08x", $num);

print "It was $hex and is now $new_hex.\n";
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top