2011-01-12 73 views
4

我有一個屬性(32位長),即每個位負責特定功能。我寫的Perl腳本應該打開第4位,但保存其他位的先前定義。位操作在Perl

我在程序中使用:

Sub BitOperationOnAttr 

{ 

my $a=""; 

MyGetFunc($a); 

$a |= 0x00000008; 

MySetFunc($a); 

} 

** MyGetFunc/MySetFunc我自己的函數,知道讀/固定值。

問題:

  1. 如果$a |= 0x00000008;用法是正確的?

  2. 從字符串由正則表達式提取的十六進制值如何我有:例如:

「屬性:Somestring:值(8長(0x8中))」

+2

你的問題是無關的;他們應該分開發布。這可以讓其他有類似問題的人更容易找到它們。 – 2011-01-12 16:13:22

+0

在PerlMonks上提出了同樣的問題:http://www.perlmonks.org/?node_id=881892 – toolic 2011-01-12 16:47:07

回答

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 
} 

應該工作。

+0

感謝您快速回答。您向我展示解決問題的正確方法 – Toren 2011-01-16 12:35:22

23

Perl提供多種方式來處理二進制數據:

  • 位運算符&|~
  • packunpack功能。
  • vec函數。

您的場景聽起來像是一組打包標誌。位運算符是一個很好的適合這樣的:

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

vec是專爲位向量使用。 (每個元素都有相同的大小,它必須是二的冪)。它可以在這裏工作還有:

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

packunpack更適合的東西像C結構或字節序的工作。