pack / unpack 函数解释

上一篇 / 下一篇  2008-12-02 12:33:57 / 个人分类:perl

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP
51Testing软件测试网 O%k$x7L-u(fp |'W

函数名 pack51Testing软件测试网j Z3c]$C c7R.l&xj
调用语法 formatstr = pack(packformat, list);51Testing软件测试网JDz;\0^ZBY3@
解说 把一个列表或数组以在实际机器存贮格式或C等编程语言使用的格式转化(包装)到一个简单变量中。参数packformat包含一个或多个格式字符,列表中每个元素对应一个,各格式字符间可用空格或tab隔开,因为pack忽略空格。
`co1h NDs0  除了格式a、A和@外,重复使用一种格式多次可在其后加个整数,如:51Testing软件测试网ARL_ R$E\O
   $twoints = pack ("i2", 103, 241);51Testing软件测试网$tA2x6D U`2n n6v
  把同一格式应用于所有的元素则加个*号,如:51Testing软件测试网:S-v^lH/F]\
   $manyints = pack ("i*", 14, 26, 11, 83);
;P~%Zb$Ch0  对于a和A而言,其后的整数表示要创建的字符串长度,重复方法如下:
)pNA7{,N2H6d0   $strings = pack ("a6" x 2, "test1", "test2");51Testing软件测试网,M U&Jjq1GB9\W`
  格式@的情况比较特殊,其后必须加个整数,该数表示字符串必须的长度,如果长度不够,则用空字符(null)补足,如:
!c~"hm!ln*c0   $output = pack ("a @6 a", "test", "test2");51Testing软件测试网,WgI.Iu un:D
  pack函数最常见的用途是创建可与C程序交互的数据,例如C语言中字符串均以空字符(null)结尾,创建这样的数据可以这样做:51Testing软件测试网z*i8w n R9~l O(w
   $Cstring = pack ("ax", $mystring);51Testing软件测试网4\,c0v*\5h;Tm
  下表是一些格式字符与C中数据类型的等价关系:

)Yg}6\ M z_ RG0

0P@},Oa6v~9G0字符   等价C数据类型
}w.V5dmr8q!l0C char51Testing软件测试网6eT(M4SL9M lm
d double51Testing软件测试网2f$ak+{?6b _Q:b ?'{
f float
6f2R4n*WC9H)e'c0i int
L:QW6QR$ycB0I unsigned int (or unsigned)51Testing软件测试网uR-m+oa'D0C
l long51Testing软件测试网e$w4^G0H7j9L0{
L unsigned long51Testing软件测试网!\"QR9sX5J)QR5c8]
s short51Testing软件测试网 e9f5yRP K u(J
S unsigned short

sK.~l-NnWq051Testing软件测试网;_FU _(Q]z-p

  完整的格式字符见下表。51Testing软件测试网K _"o)b'\ITA5ct

~3{XKT lS#OTQ,`0
3E/@P$@V P6Fv;R0格式字符   描述51Testing软件测试网 n e5z(]/v9@
a 用空字符(null)补足的字符串51Testing软件测试网8w a t1Oh UR
A 用空格补足的字符串51Testing软件测试网3g7v\K@qSb
b 位串,低位在前51Testing软件测试网6HL SX%e,X!R p
B 位串,高位在前51Testing软件测试网/z$D*FFW]3h$DY
c 带符号字符(通常-128~127)
-xC3C a#o#it0C 无符号字符(通常8位)
l"{&ca0~ fH$T,Zq0d 双精度浮点数51Testing软件测试网6`(f]w'C7qXU n?
f 单精度浮点数
F)v yt-t3c]n.^0h 十六进制数串,低位在前
"J_[,yh1\"[U[0H 十六进制数串,高位在前
5u V*xf/L ?+YW[ p0i 带符号整数51Testing软件测试网)q&Y[ra8W9yXp
I 无符号整数
E(j/i+i/} t%T0l 带符号长整数51Testing软件测试网#z_~9qAC
L 无符号长整数51Testing软件测试网fhO"Bs&M9C7E
n 网络序短整数51Testing软件测试网 vR9{ g0f4l q
N 网络序长整数
}%@E!|e0p 字符串指针51Testing软件测试网pei l?[
s 带符号短整数51Testing软件测试网n5L4?"R{/l
S 无符号短整数51Testing软件测试网9TNv sqG
u 转化成uuencode格式
3P2|j3a0Ix0v VAX序短整数
0h ~? ah5G0V VAX序长整数51Testing软件测试网5L W}\"a"b? ^
x 一个空字节
3y6T/K V+M*~7]0X 回退一个字节51Testing软件测试网[5wSO+oT|%j
@ 以空字节(null)填充

"L3tq!PU051Testing软件测试网 `.y }~W;s$`


US?*k VM[0函数名 unpack51Testing软件测试网}? ^h9T%H/Z"^4Mj
调用语法 @list = unpack (packformat, formatstr);51Testing软件测试网+K1}|^ J]8nS'B
解说 unpack与pack功能相反,将以机器格式存贮的值转化成Perl中值的列表。其格式字符与pack基本相同(即上表),不同的有:A格式将机器格式字符串转化为Perl字符串并去掉尾部所有空格或空字符;x为跳过一个字节;@为跳过一些字节到指定的位置,如@4为跳过4个字节。下面看一个@和X合同的例子:    $longrightint = unpack ("@* X4 L", $packstring);
F,Bef0Y,K,R0  此语句将最后四个字节看作无符号长整数进行转化。下面看一个对uuencode文件解码的例子:51Testing软件测试网 F+c-p.h4Wwy1?&By+pe

)B"KTR2E"h"u C%\h01 : #!/usr/local/bin/perl51Testing软件测试网Sl-Zbe[ Na
2 :
ES8D%_p:N,G K03 : open (CODEDFILE, "/u/janedoe/codefile") ||
$Y^#FK`Lyrg04 : die ("Can't open input file");
,T]qLpDk'a)OQ05 : open (OUTFILE, ">outfile") ||51Testing软件测试网%DH9S'V-B({9o!A
6 : die ("Can't open output file");51Testing软件测试网2S0hbvo-T'zb!v*b
7 : while ($line = <CODEDFILE>) {51Testing软件测试网\+VM%[In&L%H
8 : $decoded = unpack("u", $line);51Testing软件测试网sz3N*w'f3Ljaj/RvC
9 : print OUTFILE ($decoded);51Testing软件测试网H-r(jrK/sU(G
10: }
)l)RCitf q;ry011: close (OUTFILE);51Testing软件测试网#reSfo,EQw
12: close (CODEDFILE);
7H8P ^c"\6Z0  当将pack和unpack用于uuencode时,要记住,虽然它们与UNIX中的uuencode、uudecode工具算法相同,但并不提供首行和末行,如果想用uudecode对由pack的输出创建的文件进行解码,必须也把首行和末行输出。
PYlQGb?3Y8H051Testing软件测试网;jpo aS

TAG: perl

 

评分:0

我来说两句

Open Toolbar