Conversione caratteri esadecimali raggruppati in una stringa di bit in Perl
-
21-08-2019 - |
Domanda
Ho alcune stringhe di 256 caratteri di caratteri esadecimali che rappresentano una sequenza di flag di bit, e sto cercando di convertirli di nuovo in un bitstring modo che io possa manipolare con &
, |
, vec
e simili. Le stringhe esadecimali sono scritte in gruppi big-endian larga interi tali che un gruppo di 8 byte come "76543210"
dovrebbe tradursi al bitstring "\x10\x32\x54\x76"
, cioè il più basso 8 bit sono 00001000
.
Il problema è che il formato pack
s ' 'h
' funziona su un byte di ingresso alla volta, anziché 8, quindi i risultati da solo usando direttamente non sarà nel giusto ordine. Al momento sto facendo questo:
my $bits = pack("h*", join("", map { scalar reverse $_ } unpack("(A8)*", $hex)));
che funziona, ma si sente hacker. Sembra che ci dovrebbe essere un modo più pulito, ma il mio <=> - fu non è molto forte. C'è un modo migliore per fare questo una traduzione?
Soluzione
my $hex = "7654321076543210"; # can be as long as needed
my $bits = pack("V*", unpack("N*", pack("H*", $hex)));
print unpack("H*", $bits); #: 1032547610325476
Altri suggerimenti
Si consideri utilizzando gli ottimi href="http://search.cpan.org/perldoc?Bit::Vector" Bit :: Vector .
Utilizzare la funzione esagonale di trasformare la stringa esadecimale in rappresentazione interna di Perl dello il numero, fare le vostre operazioni bit per bit, e utilizzare sprintf per riattivarla nella stringa esadecimale :
#!/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";