La conversión de caracteres hexadecimales agrupados en una cadena de bits en Perl
-
21-08-2019 - |
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?
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";