4

我有一个属性(32 位长),每个位负责特定的功能。我正在编写的 Perl 脚本应该打开第 4 位,但保存以前对其他位的定义。

我在我的程序中使用:

Sub BitOperationOnAttr

{

my $a="";

MyGetFunc( $a);

$a |= 0x00000008;

MySetFunc( $a);

}

** MyGetFunc/ MySetFunc 我自己知道读取/修复值的函数。

问题:

  1. 如果使用$a |= 0x00000008;正确?

  2. 如何通过正则表达式从字符串中提取十六进制值:例如:

“属性:Somestring:值(8长(0x8))”

4

2 回答 2

23

Perl 提供了几种处理二进制数据的方法:

  • 位运算符&,|~.
  • pack函数unpack
  • vec功能。

您的场景听起来像是一组打包的标志。位运算符非常适合这种情况:

my $mask = 1 << 3;   # 0x0008
$value |=  $mask;    # set bit
$value &= ~$mask;    # clear bit
if ($value & $mask)  # check bit

vec设计用于位向量。(每个元素的大小相同,必须是 2 的幂。)它也可以在这里工作:

vec($value, 3, 1) = 1;  # set bit
vec($value, 3, 1) = 0;  # clear bit
if (vec($value, 3, 1))  # check bit

pack并且unpack更适合处理 C 结构或字节序之类的东西。

于 2011-01-12T16:32:32.650 回答
5
  1. 如果使用 $a |= 0x00000008; 是正确的 ?

是的,这很好。

  1. 如何通过正则表达式从字符串中提取十六进制值:例如:

“属性:Somestring:值(8长(0x8))”

我假设您有一个像上面这样的字符串,并且想要使用正则表达式来提取“0x8”。在这种情况下,类似:

if ($string =~ m/0x([0-9a-fA-F]+)/) {
    $value = hex($1);
} else {
    # string didn't match
}

应该管用。

于 2011-01-12T15:00:06.773 回答