免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 12143 | 回复: 7
打印 上一主题 下一主题

perl的pack and unpack的H h到底怎么用? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-07 21:49 |只看该作者 |倒序浏览
看了一个下午的perlpacktut文档,网上书上的例子也试过,但还是不太明白.
pack Expr List ------->把List打包成Expr规定的二进制结构
对于Expr的A C还是比较好的
尤其是对H(h) B(b)我弄糊涂了.
H  十六进制字符串(高位在前)
h  十六进制字符串(地位在前)
b 位次由高到低的位串
B 位次由低到高的位串
按定义H等格式应该指转换后的格式,被转换List的应该可以是任意List.

$buf=pack("H4","3061");   #这里被转换的好像只能是十六进制的数,换成字符之类的就显示不了
print "this is  $buf\n";
$buff=unpack("H4",$buf);
print "this is $buff\n";
输出
this is 0a
this is 3061
$buf=pack("H*","ABCD")  #为啥此处不行了
print "this is  $buf\n";
$buff=unpack("H*",$buf);
print "this is $buff\n";     #这里怎么输出小写的abcd,别的格式比如A只要pack和unpack用同一格式,总会正确
输出
this is  

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2008-01-08 08:21 |只看该作者
pack 把一串数字或文字..打包成一块memory....得到的可能是文字..或binary内容
例如我们要把字串透过socket传到远方..其实Socket内部就有帮忙把ip做pack的动作..

unpack把一块memory...分解成很多块....每一块可以是文字的一部份..或是memory中的一小块...
例如:接收到远方回传值时..Socket也会帮忙做unpack动作...把ip做unpack动作..

H跟h..是因为很久以前电脑演进中..有的机器从高位先读..有的机器从低位先读....

怎麽pack就要怎麽unpack...
或者当你有一串中文字..你希望传给别人时..有时候会因为编码问题无法显示..
这时候可以用unpack先将文字转换成16进制..然後请别人再pack回来...

perldoc perl里面有关於pack/unpack蛮详细的说明...

论坛徽章:
0
3 [报告]
发表于 2008-01-08 09:29 |只看该作者
多谢ls的.
我不是H跟h的区别.就H这个参数来说,你的意思是将List 转换成功勋进制字符串?!比如说一个a转换后十六进制字符什么呢?

"或者当你有一串中文字..你希望传给别人时..有时候会因为编码问题无法显示..
这时候可以用unpack先将文字转换成16进制..然後请别人再pack回来..."
你是说不必一定pack,然后unpack?两者顺序可以调换?
我理解成一定要先pack 然后unpack了............

论坛徽章:
0
4 [报告]
发表于 2008-01-08 09:50 |只看该作者
试了下面这个,
$buf=unpack("H10","1ABCD")  
print "this is  $buf\n";
$buff=pack("H10",$buf);
print "this is $buff\n";   
输出this is 3141424344
      this is 1ABCD
这样就对了
但我还是不太明白,在同一台机器上,对ABCD先pack,然后unpa ck,用的格式一样,为啥最后得到abcd,这好像和
"怎麽pack就要怎麽unpack..."矛盾了?

论坛徽章:
0
5 [报告]
发表于 2008-01-08 12:38 |只看该作者
原帖由 linewer 于 2008-1-8 09:50 发表
试了下面这个,
$buf=unpack("H10","1ABCD")  
print "this is  $buf\n";
$buff=pack("H10",$buf);
print "this is $buff\n";   
输出this is 3141424344
      this is 1ABCD
这样就对了
但我还是不太 ...



哪儿来的'abcd' ?

论坛徽章:
0
6 [报告]
发表于 2008-01-08 13:54 |只看该作者
原帖由 Lonki 于 2008-1-8 12:38 发表



哪儿来的'abcd' ?



$buf=pack("H*","ABCD")  #为啥此处不行了
print "this is  $buf\n";
$buff=unpack("H*",$buf);
print "this is $buff\n";   
输出
this is  

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2008-01-08 15:14 |只看该作者
[quote]原帖由 linewer 于 2008-1-8 13:54 发表



$buf=pack("H*","ABCD")  #为啥此处不行了
print "this is  $buf\n";
$buff=unpack("H*",$buf);
print "this is $buff\n";   
输出
this is  

论坛徽章:
0
8 [报告]
发表于 2008-01-08 16:56 |只看该作者
原帖由 apile 于 2008-1-8 15:14 发表

为什麽ABCD转成abcd...是...那个$buf在unpack回来的时候..变成小写..
因为对16进制而言..ABCD与abcd是一样的<------->\0xAB\0xCD跟\0xab\0xcd是一样的...
.

这个偶倒是不知道的说.
Learning Perl 上只讲了一点,觉得不是很明白,看过perldoc perlpacktut还是不太明白的,所以上了发帖。
我再看看perlpacktut,有问题再请教
btw,多谢apile!:wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP