2013-12-09 42 views
0

我有32位十六进制值 标如:有什么办法可以在perl中执行标量索引吗?

$foo_value = 0xabcdf123 

我还有其他4个标量,$pho0 $pho1 $pho2 $pho3这样

$pho0 = $foo_value [7:0] ## lower 8 bits of $foo_value [0x23] 
$pho1 = $foo_value [15:8] ## bits 15-8 of $foo_value [0xf1] 
$pho2 = $foo_value [23:16] ##0xcd 
$pho3 = $foo_value[31:24] ## 0xab 

有没有一种方法可以让我在Perl中做到这一点?请注意,$foo_value不能被称为数组,因此无法执行数组索引。有没有什么叫标量索引?

+0

你可以写一个子,需要一个十六进制字符串,并把它分成(如foo1,$ foo2的,$ foo3)。值的数组。你可以编写一个允许使用类似数组的语法进行字节访问的类。 – rutter

回答

3

与使用按位运算符不同吗?

$pho0 = $foo_value & 0xFF; 
$pho1 = ($foo_value >> 8) & 0xFF; 
$pho2 = ($foo_value >> 16) & 0xFF; 
$pho3 = ($foo_value >> 24) & 0xFF; 
0

一个需要十六进制字符串的子例程(是的,就像注释)。

这种方式,你不必与命名每个独立的变量来打扰

#!/usr/bin/perl 

use strict; 
use warnings; 

my $hval = "0xabcdf123"; #test value 
my @bar = splByte($hval); 

sub splByte{ 
    my $foo = shift; 
    my @temp = split('',$foo); 
    my @bar; 

    for my $i(0 .. @temp){ 
     if ($i < (@temp-1)){ 
      my $string = "0x" . join('',@temp[$i, ($i+1)]); 
      push(@bar, $string) unless $i%2; 
     } 
    } 
    shift @bar; 

    return @bar; 
} 
+0

重读这个问题几次后,我意识到这可能不是你正在寻找的。 – Gabs00

相关问题