Les opérations sur les bits en Perl
J'ai un attribut (32 bits), chaque bit responsable à des fonctionnalités spécifiques. Script Perl je suis en train d'écrire doit tourner le 4 bits, mais de sauver des définitions précédentes des autres bits.
- Je utiliser dans mon programme:
Sub BitOperationOnAttr
{
my $a="";
MyGetFunc( $a);
$a |= 0x00000008;
MySetFunc( $a);
}
** MyGetFunc/MySetFunc mes propres fonctions qui savent lire/valeur fixe.
Questions:
- si l'utilisation de
$a |= 0x00000008;
est la bonne ? - comment extraire la valeur hexadécimale par Expression Régulière à partir de la chaîne que j'ai : Par exemple:
"Attribut: Somestring: valeur (8 long (0x8))"
Vos questions ne sont pas liées; elles devraient être affichées séparément. Qui rend plus facile pour d'autres personnes ayant les mêmes questions pour les trouver.
La même question posée sur PerlMonks: perlmonks.org/?node_id=881892
La même question posée sur PerlMonks: perlmonks.org/?node_id=881892
OriginalL'auteur Toren | 2011-01-12
Vous devez vous connecter pour publier un commentaire.
Oui, c'est bien.
Je suis en supposant que vous avez une chaîne comme ci-dessus, et que vous voulez utiliser une expression régulière pour extraire le "0x8". Dans ce cas, quelque chose comme:
devrait fonctionner.
OriginalL'auteur psmears
Perl fournit plusieurs méthodes pour traiter des données binaires:
&
,|
, et~
.pack
etunpack
fonctions.vec
fonction.Votre scénario sonne comme un ensemble de paniers de drapeaux. Les opérateurs au niveau du bit sont un bon ajustement pour cela:
vec
est conçu pour une utilisation avec des vecteurs de bits. (Chaque élément a la même taille, qui doit être une puissance de deux.) Il pourrait ici aussi:pack
etunpack
sont mieux adaptés pour le travail avec des choses comme la C structures ou endianness.vec
fonctionne sur une chaîne! Si nous utilisons un certain nombre; dire:$val=5; printf("b%08b",$val);
(ce qui donneb00000101
) -- alors on peut voir que le "bit de contrôle" de la syntaxe, de dire:for($ix=7;$ix>=0;$ix--) { print vec($val, $ix, 1); }; print "\n";
ne fonctionnera pas (il donne00110101
, ce qui n'est pas le même numéro). Le bon est de convertir le nombre de caractères ASCII dans le fichier, c'est à direprint vec(sprintf("%c", $val), $ix, 1);
.OriginalL'auteur Michael Carman