`
java-admin
  • 浏览: 1365633 次
  • 性别: Icon_minigender_1
  • 来自: 陕西.西安
社区版块
存档分类
最新评论

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)}  
res = []
"abc".each_byte {|i| res << i}
res.map {|i| i.to_s(16)}


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

Cpp代码 复制代码 收藏代码
  1. "abc".unpack('H*')  
"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
   -------+---------+-----------------------------------------

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics