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?

È stato utile?

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";
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top