设为首页 收藏本站
查看: 796|回复: 0

[经验分享] perl函数pack/unpack解释

[复制链接]

尚未签到

发表于 2015-12-26 12:54:20 | 显示全部楼层 |阅读模式

函数名pack
调用语法formatstr = pack(packformat, list);
解说把一个列表或数组以在实际机器存贮格式或C等编程语言使用的格式转化(包装)到一个简单变量中。参数packformat包含一个或多个格式字符,列表中每个元素对应一个,各格式字符间可用空格或tab隔开,因为pack忽略空格。
   除了格式a、A和@外,重复使用一种格式多次可在其后加个整数,如:
    $twoints = pack ("i2", 103, 241);
   把同一格式应用于所有的元素则加个*号,如:
    $manyints = pack ("i*", 14, 26, 11, 83);
   对于a和A而言,其后的整数表示要创建的字符串长度,重复方法如下:
    $strings = pack ("a6" x 2, "test1", "test2");
   格式@的情况比较特殊,其后必须加个整数,该数表示字符串必须的长度,如果长度不够,则用空字符(null)补足,如:
    $output = pack ("a @6 a", "test", "test2");
   pack函数最常见的用途是创建可与C程序交互的数据,例如C语言中字符串均以空字符(null)结尾,创建这样的数据可以这样做:
    $Cstring = pack ("ax", $mystring);
   下表是一些格式字符与C中数据类型的等价关系:
字符  等价C数据类型
Cchar
ddouble
ffloat
iint
Iunsigned int (or unsigned)
llong
Lunsigned long
sshort
Sunsigned short
   完整的格式字符见下表。
格式字符  描述
a用空字符(null)补足的字符串
A用空格补足的字符串
b位串,低位在前
B位串,高位在前
c带符号字符(通常-128~127)
C无符号字符(通常8位)
d双精度浮点数
f单精度浮点数
h十六进制数串,低位在前
H十六进制数串,高位在前
i带符号整数
I无符号整数
l带符号长整数
L无符号长整数
n网络序短整数
N网络序长整数
p字符串指针
s带符号短整数
S无符号短整数
u转化成uuencode格式
vVAX序短整数
VVAX序长整数
x一个空字节
X回退一个字节
@以空字节(null)填充
函数名unpack
调用语法@list = unpack (packformat, formatstr);
解说unpack与pack功能相反,将以机器格式存贮的值转化成Perl中值的列表。其格式字符与pack基本相同(即上表),不同的有:A格式将机器格式字符串转化为Perl字符串并去掉尾部所有空格或空字符;x为跳过一个字节;@为跳过一些字节到指定的位置,如@4为跳过4个字节。下面看一个@和X合同的例子:     $longrightint = unpack ("@* X4 L", $packstring);
   此语句将最后四个字节看作无符号长整数进行转化。下面看一个对uuencode文件解码的例子:
1 : #!/usr/local/bin/perl
2 :
3 : open (CODEDFILE, "/u/janedoe/codefile") ||
4 : die ("Can't open input file");
5 : open (OUTFILE, ">outfile") ||
6 : die ("Can't open output file");
7 : while ($line = <CODEDFILE>) {
8 : $decoded = unpack("u", $line);
9 : print OUTFILE ($decoded);
10: }
11: close (OUTFILE);
12: close (CODEDFILE);
   当将pack和unpack用于uuencode时,要记住,虽然它们与UNIX中的uuencode、uudecode工具算法相同,但并不提供首行和末行,如果想用uudecode对由pack的输出创建的文件进行解码,必须也把首行和末行输出(详见UNIX中uuencode帮助)。
乔帮主的推荐,学习php得pack和unpack函数得好资料。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156563-1-1.html 上篇帖子: perl转载undef简介 defined函数简介 下篇帖子: Larry Wall, Perl教父访谈(Reship )
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表