Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl如何将字符串视为二进制数?_Perl - Fatal编程技术网

perl如何将字符串视为二进制数?

perl如何将字符串视为二进制数?,perl,Perl,读取包含地址和数据的文件,如下所示: @0, 12345678 @1, 5a5a5a5a ... 我的目标是读取地址和数据。考虑我读取的数据是十六进制格式,然后我需要把它们解压到二进制数。 因此,12345678将变成00010010001100111000 然后,我需要将传输的二进制数进一步解包到另一个级别。 所以它变成了,0000000000000000000000000000000000000000000010000000000000000000000000000000010000000

读取包含地址和数据的文件,如下所示:

@0, 12345678
@1, 5a5a5a5a
...
我的目标是读取地址和数据。考虑我读取的数据是十六进制格式,然后我需要把它们解压到二进制数。 因此,
12345678
将变成
00010010001100111000
然后,我需要将传输的二进制数进一步解包到另一个级别。 所以它变成了,
00000000000000000000000000000000000000000000100000000000000000000000000000000100000001000000000000000000000000000000001000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我这样做的方式如下

while(<STDIN>) {
 if (/\@(\S+)\s+(\S+)/) {
    $addr = $1;
    $data = $2;
    $mem{$addr} = ${data};
 } 
}

foreach $key (sort {$a <=> $b} (keys %mem)) {

  my $str = unpack ('B*', pack ('H*',$mem{$key}));
  my $str2 = unpack ('B*', pack ('H*', $str));
  printf ("@%x ", $key);
  printf ("%s",$str2);
  printf ("\n"); 
}
while(){
如果(/\@(\S+)\S+(\S+/){
$addr=$1;
$data=$2;
$mem{$addr}=${data};
} 
}
foreach$key(排序{$a$b}(键%mem)){
my$str=unpack('B*',pack('H*',$mem{$key}));
my$str2=拆包('B*',包装('H*',$str));
printf(“@%x”,$key);
printf(“%s”,$str2);
printf(“\n”);
}
但是,我的下一步是对传输的位执行一些数字操作。 例如按位或和移位。我试过你可以使用Metaspan的模块

use strict;
use warnings;
use Bit::Vector;

my $str = "1111000011011001010101000111001100010000001111001010101000111010001011";
printf "orig str: %72s\n", $str;

#only 72 bits for better view
my $vec = Bit::Vector->new_Bin(72,$str);
printf "vec     : %72s\n", $vec->to_Bin();

$vec->Move_Left(2); 
printf "left 2  : %72s\n", $vec->to_Bin();

$vec->Move_Right(4); 
printf "right 4 : %72s\n", $vec->to_Bin();
印刷品:

orig str:   1111000011011001010101000111001100010000001111001010101000111010001011
vec     : 001111000011011001010101000111001100010000001111001010101000111010001011
left 2  : 111100001101100101010100011100110001000000111100101010100011101000101100
right 4 : 000011110000110110010101010001110011000100000011110010101010001110100010
如果您需要任意精度的数学运算,您也可以使用或
使用bigint
()

您可以使用Metaspan中的模块

use strict;
use warnings;
use Bit::Vector;

my $str = "1111000011011001010101000111001100010000001111001010101000111010001011";
printf "orig str: %72s\n", $str;

#only 72 bits for better view
my $vec = Bit::Vector->new_Bin(72,$str);
printf "vec     : %72s\n", $vec->to_Bin();

$vec->Move_Left(2); 
printf "left 2  : %72s\n", $vec->to_Bin();

$vec->Move_Right(4); 
printf "right 4 : %72s\n", $vec->to_Bin();
印刷品:

orig str:   1111000011011001010101000111001100010000001111001010101000111010001011
vec     : 001111000011011001010101000111001100010000001111001010101000111010001011
left 2  : 111100001101100101010100011100110001000000111100101010100011101000101100
right 4 : 000011110000110110010101010001110011000100000011110010101010001110100010
如果需要任意精度的数学运算,也可以使用或
使用bigint
()

十六进制和二进制是数字的文本表示形式。移位和位操作是数字操作。你要的是数字,不是文字

my $hex = '5a5a5a5a';
$num = hex($hex);               # Convert to number.
$num >>= 1;                     # Manipulate the number.
$hex = sprintf('%08X', $num);   # Convert back to hex.
在评论中,您提到要处理256位数字。本机数字不支持这一点,但可以使用Math::BigInt。

十六进制和二进制是数字的文本表示形式。移位和位操作是数字操作。你要的是数字,不是文字

my $hex = '5a5a5a5a';
$num = hex($hex);               # Convert to number.
$num >>= 1;                     # Manipulate the number.
$hex = sprintf('%08X', $num);   # Convert back to hex.

在评论中,您提到要处理256位数字。本机数字不支持这一点,但您可以使用Math::BigInt。

我的最终解决方案是忘记将它们视为数字,将它们视为字符串。我使用子字符串和字符串集中来代替移位。然后对于or运算,我只需将字符串的每一位相加,如果是0,结果是0,否则是1


这可能不是解决这个问题的最好办法。但这就是我最后使用的方式

我的最终解决方案是,不要把它们当作数字,只把它们当作字符串。我使用子字符串和字符串集中来代替移位。然后对于or运算,我只需将字符串的每一位相加,如果是0,结果是0,否则是1


这可能不是解决这个问题的最好办法。但这就是我最后使用的方式

首先做算术运算,然后转换成一个由1和0组成的字符串。特里皮耶:我想对最后的256位二进制数进行移位,我不知道如何先进行移位。是的,是对实际数进行移位,而不是对它们的字符串表示。你能给我举个例子吗?@tripleee你不能简单地对256位的数字做算术,而不使用一些
bigint
库。先做算术,然后转换成一个由1和0组成的字符串。tripleee:我想对最后的256位二进制数做一个移位,我不知道该怎么做。是的,在实际的数字上,而不是在它们的字符串表示上。你能给我举个例子吗?@tripleee如果不使用一些
bigint
库,你就不能简单地对256位的数字进行算术运算。你能给96位(12字节)的数字加上一个移位(左-右)的例子吗?@kobame,您可以使用
b@kobame,
sprintf(“%096s”,substr($num->as_bin(),2))
谢谢。现在知道了-需要使用移位量的
substr
。您可以添加一些例子,用Math::BigInt对96位(12字节)的数字进行移位(左-右),例如,结果也应该是96位吗?@kobame,您可以使用
b@kobame,
sprintf('%096s',substr($num->as_bin(),2))
谢谢。现在知道了-需要使用移位量的
substr