perl的pack与unpack函数
本节主要内容:
perl的pack与unpack函数
formatstr = pack(packformat, list);
把一个列表或数组以在实际机器存贮格式或C等编程语言使用的格式转化(打包)到一个简单变量中。参数packformat包含一个或多个格式字符,列表中每个元素对应一个,各格式字符间可用空格或tab隔开,因为pack忽略空格。
1,除了格式a、A和@外,重复使用一种格式多次可在其后加个整数,如:
2,把同一格式应用于所有的元素则加个*号,如:
3,对于a和A而言,其后的整数表示要创建的字符串长度,重复方法如下:
4,格式@的情况比较特殊,其后必须加个整数,该数表示字符串必须的长度,如果长度不够,则用空字符(null)补足,如:
5,pack函数最常见的用途是创建可与C程序交互的数据,例如C语言中字符串均以空字符(null)结尾,创建这样的数据可以这样做:
6,一些格式字符与C中数据类型的等价关系:
C char
d double
f float
i int
I unsigned int (or unsigned)
l long
L unsigned long
s short
S unsigned 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格式
v : VAX序短整数
V : VAX序长整数
x : 一个空字节
X : 回退一个字节
@ : 以空字节(null)填充
@list = unpack(packformat, formatstr);
unpack与pack功能相反,将以机器格式存贮的值转化成Perl中值的列表。
其格式字符与pack基本相同(即上表),不同的有:A格式将机器格式字符串转化为Perl字符串并去掉尾部所有空格或空字符;
x为跳过一个字节;@为跳过一些字节到指定的位置,如@4为跳过4个字节。
@和X合同的例子:
$longrightint = unpack ("@* X4 L", $packstring);
此语句将最后四个字节看作无符号长整数进行转化。
对uuencode文件解码的例子:
#!/usr/local/bin/perl
open (CODEDFILE, "/u/janedoe/codefile") ||
die ("Can't open input file");
open (OUTFILE, ">outfile") ||
die ("Can't open output file");
while ($line = <CODEDFILE>) {
$decoded = unpack("u", $line);
print OUTFILE ($decoded);
}
close (OUTFILE);
close (CODEDFILE);
当将pack和unpack用于uuencode时,注意,虽然它们与UNIX中的uuencode、uudecode工具算法相同,但并不提供首行和末行,如果想用uudecode对由pack的输出创建的文件进行解码,必须也把首行和末行输出(详见UNIX中uuencode帮助)。
您可能感兴趣的文章:
perl pack与unpack函数的例子
perl的pack与unpack函数
PHP中的pack和unpack函数的用法详解
php实现对图片对称加解密(适用身份证加密等场景)
PHP的实现一个高效的数据库(文件存储,NOSQL)
php - tcp 粘包/拆包实例
perl实例之子程序
【golang】1.14的sync.Pool原理分析
php 获取QQwry.dat真实IP地址
python入门必会的助手函数:dir()函数