Perl函数pack/unpack解释:http://hi.baidu.com/powersaven/blog/item/26f619c5a8d41bc239db49d6.html
[Perl]pack/unpack函数--利用模板控制文字格式:http://blog.csdn.net/peng_zhou/article/details/3962429
************************************************************************************************************
简单的说:
unpack:
将perl字串stirng转化为对应的机器码字串,如my $str_asc = unpack("H*",$str);将字符串$str转换为其对应的十六进制字符串$str_asc。
“1”->"\x31"即是:$str_x31 = unpack("H*","1");目的是对机器码字串进行操作。
应用:
一般,需要得到机器码,要对机器码操作时(如读取后需要改写二进制文件、编码格式转换、正则操作等),要unpack一下。
1)perl字符某种编码格式(如“UTF-16”)对应的机器码
my $char = "你好世界";
my $c1 = unpack("H*", encode("UTF-16", $char));
2)读取编码格式文件(如“UTF-16”)
my $c1 = unpack("H*", encode("UTF-16", decode("UTF-16",$data)));
3)读取二进制文件
binmode(PF_IN);
read(PF_IN, $pDataHead,44,0);
my $binData = unpack("H*",$pDataHead)
************************************************************************************************************
pack:
作用正好相反:将机器码字符串转化为对应的perl字符串str。“\x31”->"1"即是:$str_1 = pack("H*","31")。
应用:
一般,需要输出或打包机器码串之前,需要pack一下;或已知机器码串,需要得到对应的字符串时,需要pack。
1)、二进制写文件之前,需要将机器码串(如"FFFE3031")pack后输出到文件;
binmode(PF_OUT);
print PF_OUT pack("H*","FFFE").encode("utf16le",$line);
2)、网络报文发送前,需要pack将机器码串打包;解析前需要先unpack
************************************************************************************************************
说明:
1)bimode读取二进制文件,实际读到的不是机器码,仍然是perl字符串,需要unpack后进行操作。
binmode:如果在文本文件中发现 ^Z 字符,则可能会造成程序退出或者碰到换行符转换方面的问题;通过指定二进制文件模式避免该问题。
写二进制文件前,需要将二进制码串pack为相应的perl字符串。