免费注册 查看新帖 |

Chinaunix

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

pppk之Recipe1.1(2) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-16 20:02 |只看该作者 |倒序浏览
本帖最后由 zhuyubei 于 2012-08-16 20:04 编辑

今天继续Recipe1.1的剩余部分。使用unpack来获取子字符串。unpack会把字符串当成字节流来处理。

unpack需要一个格式化字符串和输入字符串。
  1. unpack( fmt, string )
复制代码
而格式化字符串由可识别的关键字符和其需要的数量组成。比如关键字符x代表跳过字节,A表示获取字节
  1. x: skip, X: backward skip A: get byte
复制代码
看个例子。这个例子是先跳过6个字节,再读取6个字节。这样$sUnppackStr的得就是or not

  1. $sString = "To be or not to be";
  2. my $sUnpackStr = unpack( "x6 A6 ", $sString ); #skip 6 bytes, then get 6 bytes
  3. print "After unpack: $sUnpackStr\n";
复制代码
这样通过格式化字符串,可以让unpack一次返回多个子字符串。标量环境下,返回多个子字符串的话,标量会接受第一个子字符串
  1. # Get multiple substrings at a time
  2. # X5: backward skip bytes, A*: Get rest of the bytes
  3. my ( $sStr1, $sStr2, $sStr3 ) = unpack( "x6 A2 X5 A2 A*", $sString );  
  4. print "Multiple substrings: [$sStr1], [$sStr2], [$sStr3]\n";

  5. # scalar context uses the first value
  6. my ( $sScalar ) = unpack( "x6 A2 X5 A2 A*", $sString );  
  7. print "Scalar context: [$sScalar]\n";
复制代码
另外Perl的unpack有个很强大的功能,就是使用在格式化字符串里使用A*, 可以让unpack返回从当前字节位置到字符串结尾的子字符串。
  1. "x6 A2 A*"
复制代码

这个格式化字符串的意思是跳过6字节,读取2个字节,再读取字符串里剩余的字节。

而Python则不支持这种格式化方式来获取到结尾的子字符串


论坛徽章:
0
2 [报告]
发表于 2012-08-16 20:14 |只看该作者
而Python也有这样的unpack函数。但是没有Perl如此的好用。

要使用unpack,先要载人struct模块。而unpack的使用和Perl里类似。只是格式化字符串略有区别。字节数被放到了前面。Perl的unpack用到的A,这里变成了s
  1. unpack( " 6x 6s ", string )
复制代码
其次,Python不支持A*这样返回剩余字节的方式。我们必须针对字符串,显示计算出当前字节到字符串末尾的字节数。计算方法如下

  1. # cal the rest byte number from the format string
  2.   numremain = len( string ) - struct.calcsize( baseformat )
复制代码
struct提供了一个函数calcsize, 它能根据格式化字符串来计算其占用的字节数。然后我们再用字符串长度来减去这个占用的字节数,就能获取,当前字节到末尾的字节数了。

这是要值得注意的地方。其他一些函数,就看代码好了。

checkout地址如下

  1. svn checkout http://pppk.googlecode.com/svn/trunk/ pppk
复制代码

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
3 [报告]
发表于 2012-08-16 21:02 |只看该作者
坚持....

论坛徽章:
0
4 [报告]
发表于 2012-08-16 21:31 |只看该作者
回复 3# cdtits


    放轻松就好。哈哈

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
5 [报告]
发表于 2012-08-17 02:42 |只看该作者
Python大局那么好
Perl细节那么好
两种语言揉一揉就好了。

论坛徽章:
0
6 [报告]
发表于 2012-08-17 10:26 |只看该作者
楼主  能不能讲快点啊~ 每天写2个呗~

论坛徽章:
0
7 [报告]
发表于 2012-08-17 10:38 |只看该作者
回复 6# 78612576


    越冒进越容易自我放弃,因为对自己要求太高。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP