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
Perl XOR转义字符串,其中包含^&引用;_Perl_Escaping_Xor - Fatal编程技术网

Perl XOR转义字符串,其中包含^&引用;

Perl XOR转义字符串,其中包含^&引用;,perl,escaping,xor,Perl,Escaping,Xor,在Perl中执行按位异或时,如何转义“^”字符?我的脚本正常,但当我输入一个字符串,如.1M80P]/)S@*>RQF^RM

在Perl中执行按位异或时,如何转义“^”字符?我的脚本正常,但当我输入一个字符串,如
.1M80P]/)S@*>RQF^RM<\n
时,输出会出错:

#!/usr/bin/perl

$key = pack("H*","3cb37efae7f4f376ebbd76cd");

print "Enter string to decode: ";
$str=<STDIN>;chomp $str; $str =~s/\\(.)/$1/g;
$dec = decode($str);
print "Decoded string value: $dec\n";

sub decode{
    @subvar=@_;
    my $sqlstr = $subvar[0];
    $cipher = unpack("u", $sqlstr);
    $plain = $cipher^$key;
    return substr($plain, 0, length($cipher));
}

这就是解决方案,感谢ikegami的帮助:

#!/usr/bin/perl
use strict;
use warnings;

sub deliteral {
   my ($s) = @_;
   $s =~ s/\\n/\n/g;
   die "Unrecognised escape \\$1\n" if $s =~ /(?<!\\)(?:\\{2})*\\([a-zA-Z0-9])/;   $s =~ s/\\(.)/$1/sg;
   return $s;   
}

sub uudecode {
   return unpack 'u', $_[0];
}

sub decode {
   my ($key, $cipher) = @_;
   return substr($cipher^$key, 0, length($cipher)); # XXX
}

my $key = pack('H*', '3cb37efae7f4f376ebbd76cdfce7391e9ed9cee4cfceb4b33332fc96ff7b');

print "Enter string to decode: ";
chomp( my $coded = <STDIN> );

my $cipher = uudecode(deliteral($coded));
my $plain = decode($key, $cipher);
print("Plain text: $plain\n");
#/usr/bin/perl
严格使用;
使用警告;
近交{
我的($s)=;
$s=~s/\\n/\n/g;
如果$s=~/(?),则为“未识别的转义\\$1\n”;
my$cipher=uudecode(deliteral($coded));
my$plain=解码($key,$cipher);
打印(“纯文本:$Plain\n”);

问题在于键的长度。

您期望的输出是什么?所以您是说当纯文本比键长时,它不起作用。实际上不起作用:
,6\\\=/S,G\!PQF?SQF5\n
解码为
gt16.50otroX
比键长多少?您是对的,不是。可能是问题em和长度有什么关系?
#!/usr/bin/perl
use strict;
use warnings;

sub deliteral {
   my ($s) = @_;
   $s =~ s/\\n/\n/g;
   die "Unrecognised escape \\$1\n" if $s =~ /\\[a-zA-Z0-9]/;
   $s =~ s/\\(.)/$1/sg;
   return $s;   
}

sub uudecode {
   return unpack 'u', $_[0];
}

sub decode {
   my ($key, $cipher) = @_;
   return substr($cipher^$key, 0, length($cipher)); # XXX
}

my $key = pack('H*', '3cb37efae7f4f376ebbd76cd');

print "Enter string to decode: ";
chomp( my $coded = <STDIN> );

my $cipher = uudecode(deliteral($coded));
my $plain = decode($key, $cipher);
print("Plain text: $plain\n");
#!/usr/bin/perl
use strict;
use warnings;

sub deliteral {
   my ($s) = @_;
   $s =~ s/\\n/\n/g;
   die "Unrecognised escape \\$1\n" if $s =~ /(?<!\\)(?:\\{2})*\\([a-zA-Z0-9])/;   $s =~ s/\\(.)/$1/sg;
   return $s;   
}

sub uudecode {
   return unpack 'u', $_[0];
}

sub decode {
   my ($key, $cipher) = @_;
   return substr($cipher^$key, 0, length($cipher)); # XXX
}

my $key = pack('H*', '3cb37efae7f4f376ebbd76cdfce7391e9ed9cee4cfceb4b33332fc96ff7b');

print "Enter string to decode: ";
chomp( my $coded = <STDIN> );

my $cipher = uudecode(deliteral($coded));
my $plain = decode($key, $cipher);
print("Plain text: $plain\n");