Convertendo caracteres hexadecimais agrupados em um bitstring em Perl
-
21-08-2019 - |
Pergunta
Eu tenho algumas cadeias de 256 caracteres de caracteres hexadecimais que representam uma seqüência de sinalizadores de bit, e eu estou tentando convertê-los de volta em um bitstring para que eu possa manipulá-los com &
, |
, vec
e similares. As cordas hexadecimais são escritos em grupos inteiros de largura grande-endian, de tal modo que um grupo de 8 bytes como "76543210"
deve traduzir para o "\x10\x32\x54\x76"
bitstring, isto é, os 8 bits mais baixos são 00001000
.
O problema é o formato "pack
" Isso é h
funciona em um byte de entrada de cada vez, em vez de 8, de modo que os resultados de apenas usá-lo diretamente não será na ordem certa. No momento eu estou fazendo isso:
my $bits = pack("h*", join("", map { scalar reverse $_ } unpack("(A8)*", $hex)));
que funciona, mas se sente hackish. Parece que deve haver uma maneira mais limpa, mas meu pack
-fu não é muito forte. Existe uma maneira melhor de fazer esta tradução?
Solução
my $hex = "7654321076543210"; # can be as long as needed
my $bits = pack("V*", unpack("N*", pack("H*", $hex)));
print unpack("H*", $bits); #: 1032547610325476
Outras dicas
Considere usar o excelente Bit :: Vector .
Use a hex de função para ativar a string hex em representação interna do Perl do número, faça suas operações bit a bit, e usar sprintf para transformá-lo de volta para a string hex :
#!/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";