Ruby String#unpack

转自:http://fuliang.iteye.com/blog/680502

从一个例子开始:如何将一个字符串转化成一个十六进制的串。一种方法是使用字符串的each_byte来做:

Ruby代码   收藏代码
  1. res = []  
  2. "abc".each_byte {|i| res << i}  
  3. res.map {|i| i.to_s(16)}  


写了三行才实现出来这个功能,非常不爽。我们看看unpack的强大功能吧:

Cpp代码   收藏代码
  1. "abc".unpack('H*')  


一行代码搞定。 
unpack将传入的参数作为指令,作用于调于的字符串,处理过程是一个流式的过程,每一个字符指令后面可能跟着一个数字,数字代表顺序作用于字符串字符的次数,*代表顺序作用域剩余的所有字符。

上面例子H*指令,代表每次取半字节的16进制数。

unpack可以非常方便的处理字符串的各种转换。

 

以下字符指令的参考表(来自rdoc):

 

Format | Returns | Function
   -------+---------+-----------------------------------------
     A     | String  | with trailing nulls and spaces removed
   -------+---------+-----------------------------------------
     a     | String  | string
   -------+---------+-----------------------------------------
     B      | String  | extract bits from each character (msb first)
   -------+---------+-----------------------------------------
     b     | String  | extract bits from each character (lsb first)
   -------+---------+-----------------------------------------
     C     | Fixnum  | extract a character as an unsigned integer
   -------+---------+-----------------------------------------
     c      | Fixnum  | extract a character as an integer
   -------+---------+-----------------------------------------
     d,D  | Float   | treat sizeof(double) characters as
            |            | a native double
   -------+---------+-----------------------------------------
     E     | Float   | treat sizeof(double) characters as
            |            | a double in little-endian byte order
   -------+---------+-----------------------------------------
     e     | Float   | treat sizeof(float) characters as
            |            | a float in little-endian byte order
   -------+---------+-----------------------------------------
     f,F   | Float    | treat sizeof(float) characters as
            |            | a native float
   -------+---------+-----------------------------------------
     G     | Float   | treat sizeof(double) characters as
            |            | a double in network byte order
   -------+---------+-----------------------------------------
     g     | Float   | treat sizeof(float) characters as a
            |            | float in network byte order
   -------+---------+-----------------------------------------
     H     | String  | extract hex nibbles from each character
            |             | (most significant first)
   -------+---------+-----------------------------------------
     h     | String  | extract hex nibbles from each character
            |            | (least significant first)
   -------+---------+-----------------------------------------
     I      | Integer | treat sizeof(int) (modified by _)
            |              | successive characters as an unsigned
            |              | native integer
   -------+---------+-----------------------------------------
     i      | Integer | treat sizeof(int) (modified by _)
            |             | successive characters as a signed
            |             | native integer
   -------+---------+-----------------------------------------
     L     | Integer | treat four (modified by _) successive
            |             | characters as an unsigned native
            |             | long integer
   -------+---------+-----------------------------------------
     l      | Integer | treat four (modified by _) successive
            |              | characters as a signed native
            |              | long integer
   -------+---------+-----------------------------------------
     M    | String  | quoted-printable
   -------+---------+-----------------------------------------
     m    | String  | base64-encoded
   -------+---------+-----------------------------------------
     N     | Integer | treat four characters as an unsigned
            |              | long in network byte order
   -------+---------+-----------------------------------------
     n     | Fixnum | treat two characters as an unsigned
            |             | short in network byte order
   -------+---------+-----------------------------------------
     P     | String  | treat sizeof(char *) characters as a
            |            | pointer, and  return \emph{len} characters
            |            | from the referenced location
   -------+---------+-----------------------------------------
     p     | String  | treat sizeof(char *) characters as a
            |            | pointer to a  null-terminated string
   -------+---------+-----------------------------------------
     Q     | Integer | treat 8 characters as an unsigned
            |             | quad word (64 bits)
   -------+---------+-----------------------------------------
     q     | Integer | treat 8 characters as a signed
            |              | quad word (64 bits)
   -------+---------+-----------------------------------------
     S     | Fixnum  | treat two (different if _ used)
            |              | successive characters as an unsigned
            |              | short in native byte order
   -------+---------+-----------------------------------------
     s     | Fixnum  | Treat two (different if _ used)
            |              | successive characters as a signed short
            |              | in native byte order
   -------+---------+-----------------------------------------
     U     | Integer | UTF-8 characters as unsigned integers
   -------+---------+-----------------------------------------
     u     | String   | UU-encoded
   -------+---------+-----------------------------------------
     V     | Fixnum  | treat four characters as an unsigned
            |              | long in little-endian byte order
   -------+---------+-----------------------------------------
     v     | Fixnum | treat two characters as an unsigned
            |             | short in little-endian byte order
   -------+---------+-----------------------------------------
     w    | Integer | BER-compressed integer (see Array.pack)
   -------+---------+-----------------------------------------
     X     | ---        |   skip backward one character
   -------+---------+-----------------------------------------
     x     | ---     | skip forward one character
   -------+---------+-----------------------------------------
     Z     | String  | with trailing nulls removed
            |         | upto first null with *
   -------+---------+-----------------------------------------
     @    | ---        | skip to the offset given by the
            |             | length argument
   -------+---------+-----------------------------------------

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值