首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl密码学:加密/解密具有打包和解压缩功能的ASCII切割机

Perl密码学:加密/解密具有打包和解压缩功能的ASCII切割机
EN

Stack Overflow用户
提问于 2012-07-17 04:10:53
回答 3查看 977关注 0票数 2

我需要帮助弄清楚这两个子程序是如何工作的,以及它们返回的值或数据结构。下面是代码的最小表示:

代码语言:javascript
复制
#!/usr/bin/perl
use strict; use warnings;

# an array of ASCII encrypted characters
my @quality = ("C~#p)eOA`/>*", "DCCec)ds~~", "*^&*"); # for instance

# input the quality
# the '@' character in front deferences the subroutine's returned array ref 
my @q = @{unpack_qual_to_phred(@quality)};

print pack_phred_to_qual(\@q) . "\n";

sub unpack_qual_to_phred{
    my ($qual)=@_;
    my $upack_code='c' . length($qual);
    my @q=unpack("$upack_code",$qual);
    for(my $i=0;$i<@q;$i++){
        $q[$i]-=64;
    }
    return(\@q);
}

sub pack_phred_to_qual{
    my ($q_ref)=@_;
    @q=@{$q_ref};
    for(my $i=0;$i<@q;$i++){
        $q[$i]+=64;
    }
    my $pack_code='c' . int(@q);
    my $qual=pack("$pack_code",@q);

    return ($qual);
}


1;

据我所知,unpack_qual_to_phread()子例程显然解密了存储在@quality中的ASCII字符元素。子例程读取包含ASCII字符元素的数组。数组中的每个元素都被处理并明显地解密。然后,子例程返回包含解密数组元素的数组引用。但是,我对Perl函数packunpack并不熟悉。另外,我在网上找不到任何好的例子。

我认为pack_phred_to_qual子例程将质量数组ref转换回ASCII字符并打印它们。

谢谢。如有任何帮助或建议,将不胜感激。另外,如果有人能够提供一个简单的例子,说明Perl的packunpack函数是如何工作的,这也会有所帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-17 04:32:14

计算长度是不必要的。这些函数可以简化为

代码语言:javascript
复制
sub unpack_qual_to_phred { [ map $_ - 64, unpack 'c*', $_[0] ] }
sub pack_phred_to_qual { pack 'c*', map $_ + 64, @{ $_[0] } }

在加密方面,这是一个疯狂的简单替换密码。它简单地从每个字符的字符数中减去64。它可以写成

代码语言:javascript
复制
sub encrypt { map $_ - 64, @_ }
sub decrypt { map $_ + 64, @_ }

pack/unpack根本不考虑加密/解密;它只是对每个字节进行迭代的一种方式。

票数 3
EN

Stack Overflow用户

发布于 2012-07-17 04:25:00

这是相当简单的,作为包装。是调用unpack("c12", "C~#p)eOA/>*)‘,它依次接收每个字母并为该字母查找ascii值,然后从该值中减去64 (好吧,减去64是一个后处理步骤,与pack无关)。字母"C“是ascii 67,67-64是3。因此,这个函数的第一个值是3,其次是"~”,它是ascii 126。126-64是62.下一个是#,它是ascii 35,35-64是-29,等等.

从脚本生成的完整数字集是:

3,62,-29,48,-23,37,15,32,-17,-2,-22

“加密”步骤简单地逆转了这个过程。添加64,然后将其转换为字符。

票数 3
EN

Stack Overflow用户

发布于 2012-07-17 04:21:53

这不是你问题的完整答案,但你读过包囊吗?还是pack/拆包perldoc上的文档?这些可能对你的理解有很大帮助。

编辑:

下面是一个简单的思考方法:假设您在内存中存储了一个4字节的数字,1234。如果它在perl标量中,$num,那么

代码语言:javascript
复制
pack('s*', $num)

会回来

代码语言:javascript
复制
π♦

或者不管"1234“的实际内部存储值是什么。因此,pack()将标量值作为字符串处理,并将其转换为数字的实际二进制表示(您可以看到打印出来的“pi-菱形”,因为这是该数字的ASCII表示)。相反,

代码语言:javascript
复制
unpack('s*', "π♦")

返回字符串"1234“。

您的unpack()子例程的unpack_qual_to_phred()部分可以简化为:

代码语言:javascript
复制
my @q = unpack("c12", "C~#p)e0A`/>*");

它将返回ASCII字符对的列表,每个字符对对应于第二个参数中的一个字节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11515904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档