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?

Foi útil?

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";
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top