Question

J'ai quelques chaînes de caractères hexadécimaux qui représentent une séquence de bits drapeaux de 256 caractères, et je suis en train de les convertir en un bitstring je peux les manipuler avec &, |, vec etc. Les cordes hexagonales sont écrites dans des groupes à grande échelle endian entiers, de telle sorte qu'un groupe de 8 octets comme "76543210" devrait se traduire par la chaîne binaire "\x10\x32\x54\x76", à savoir les 8 bits inférieurs sont 00001000.

Le problème est que le format « pack » s 'fonctionne sur un h octet d'entrée à la fois, au lieu de 8, de sorte que les résultats de l'utiliser tout sera directement pas dans le bon ordre. En ce moment je fais ceci:

my $bits = pack("h*", join("", map { scalar reverse $_ } unpack("(A8)*", $hex)));

qui fonctionne, mais se sent hackish. Il semble que il devrait y avoir un moyen plus propre, mais mon <=> - fu est pas très forte. Y at-il une meilleure façon de faire cette traduction?

Était-ce utile?

La solution

my $hex = "7654321076543210";  # can be as long as needed
my $bits = pack("V*", unpack("N*", pack("H*", $hex)));
print unpack("H*", $bits);  #: 1032547610325476

Autres conseils

Pensez à utiliser l'excellent Bit :: Vector.

Utilisez la fonction hexagonale pour transformer la chaîne hexagonale dans la représentation interne de Perl du numéro, faites vos opérations au niveau du bit, et utilisez sprintf pour la remettre dans la chaîne hexagonale :

#!/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";
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top