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
。