Perl 数组到变量的转换
Perl array to variable conversion
如代码所示。我已将一个十六进制数转换为二进制数,将其添加到一个数组中并重新洗牌。
我想将它转换回十六进制并卡在将数组转换为变量然后再转换为十六进制的步骤。我已经使用了几个我评论过的步骤,但它们没有用。有没有办法将数组转换为变量,然后为我的情况转换为十六进制
#!/usr/bin/env perl
use warnings;
import math
my $value = hex ( 'FE300B0' );
print "Dec: ",$value,"\n";
printf ( "Hex: %X\n", $value );
my $binval = sprintf ( "%0*b\n",32, $value );
print $binval;
my @binval_arr = split('', $binval, 32);
#print "Size: ",scalar @binval_arr,"\n";
#print "$binval_arr[27] = $binval_arr[27]\n";
print @binval_arr;
#my @mod_bin = @binval_arr;
#my @mod_bin;
my @mod_bin = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
#modifeid 20..31
@mod_bin[20..31] = @binval_arr[20..31];
@mod_bin[9] = $binval_arr[10];
@mod_bin[18,19] = @binval_arr[14,15];
@mod_bin[10..17] = @binval_arr[2..9];
#print join("\n",@binval_arr),"\n";
print @mod_bin,"\n";
#my $mod_str = join('', @mod_bin);
#print $mod_str,"\n";
my $mod_int = int(@mod_bin);
my $mod_int = \@mod_bin;
print $mod_int,"\n";
output ::
Dec: 266535088
Hex: FE300B0
00001111111000110000000010110000
00001111111000110000000010110000
00000000010011111111000010110000
ARRAY(0x5635e48dcca8)
一种执行二进制到十六进制操作的方法是:
$hex = sprintf "%x", oct("0b$binary");
要将包含“0”和“1”元素的数组转换为包含“0”和“1”字符的 32 字符标量,请使用
$binary = join("", @mod_bin);
您根本不应该转换 to/from 二进制文件。您应该使用位算术运算符。
my $value = hex( 'FE300B0' );
my $modified =
( ( $value >> 2 ) & 0x0FFF ) << 2
| ( ( $value >> 21 ) & 0x0001 ) << 22
| ( ( $value >> 16 ) & 0x0003 ) << 12
| ( ( $value >> 22 ) & 0x00FF ) << 14;
请注意,这两次分配给第 13 位($mod_bin[18]
原始),就像您的代码一样。这肯定是一个错误?
如代码所示。我已将一个十六进制数转换为二进制数,将其添加到一个数组中并重新洗牌。
我想将它转换回十六进制并卡在将数组转换为变量然后再转换为十六进制的步骤。我已经使用了几个我评论过的步骤,但它们没有用。有没有办法将数组转换为变量,然后为我的情况转换为十六进制
#!/usr/bin/env perl
use warnings;
import math
my $value = hex ( 'FE300B0' );
print "Dec: ",$value,"\n";
printf ( "Hex: %X\n", $value );
my $binval = sprintf ( "%0*b\n",32, $value );
print $binval;
my @binval_arr = split('', $binval, 32);
#print "Size: ",scalar @binval_arr,"\n";
#print "$binval_arr[27] = $binval_arr[27]\n";
print @binval_arr;
#my @mod_bin = @binval_arr;
#my @mod_bin;
my @mod_bin = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
#modifeid 20..31
@mod_bin[20..31] = @binval_arr[20..31];
@mod_bin[9] = $binval_arr[10];
@mod_bin[18,19] = @binval_arr[14,15];
@mod_bin[10..17] = @binval_arr[2..9];
#print join("\n",@binval_arr),"\n";
print @mod_bin,"\n";
#my $mod_str = join('', @mod_bin);
#print $mod_str,"\n";
my $mod_int = int(@mod_bin);
my $mod_int = \@mod_bin;
print $mod_int,"\n";
output ::
Dec: 266535088
Hex: FE300B0
00001111111000110000000010110000
00001111111000110000000010110000
00000000010011111111000010110000
ARRAY(0x5635e48dcca8)
一种执行二进制到十六进制操作的方法是:
$hex = sprintf "%x", oct("0b$binary");
要将包含“0”和“1”元素的数组转换为包含“0”和“1”字符的 32 字符标量,请使用
$binary = join("", @mod_bin);
您根本不应该转换 to/from 二进制文件。您应该使用位算术运算符。
my $value = hex( 'FE300B0' );
my $modified =
( ( $value >> 2 ) & 0x0FFF ) << 2
| ( ( $value >> 21 ) & 0x0001 ) << 22
| ( ( $value >> 16 ) & 0x0003 ) << 12
| ( ( $value >> 22 ) & 0x00FF ) << 14;
请注意,这两次分配给第 13 位($mod_bin[18]
原始),就像您的代码一样。这肯定是一个错误?