`
java-admin
  • 浏览: 1390160 次
  • 性别: 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
   -------+---------+-----------------------------------------

分享到:
评论

相关推荐

    ruby 2.3.1 windows64位安装包

    - **String#unpack1**:新的方法,可以从二进制字符串中提取单个元素。 - **Integer#digits**:返回一个数组,包含整数的二进制、八进制、十进制或十六进制表示的每一位数字。 - **Performance Enhancements**:包括...

    ruby基础教程(第四版)第19章 encoding编码1

    - **Array#unpack**:用于将读取的字节串按照指定的格式拆分。 总结来说,Ruby中的字符串编码管理是一个非常灵活而强大的特性。开发者可以通过合理设置脚本编码、使用`Encoding`类的方法以及注意字符串的操作,确保...

    Ruby中操作字符串的一些基本方法

    在Ruby编程语言中,字符串(String)是处理文本数据的基本元素。字符串可以由单引号或双引号定义,其中双引号允许转义字符和变量插入。Ruby中的字符串操作非常灵活,提供了丰富的函数和方法来处理字符串内容。 1. **...

    MRuby Win32静态开发包,修复原版链接问题

    `pack` gem 提供了数据打包和解包的功能,类似于 Ruby 的 `Array#pack` 和 `String#unpack` 方法。这在处理二进制数据,如网络传输或文件存储时非常有用。 `file` 和 `io` gem 提供了与文件系统和输入/输出操作相关...

    Ruby数据结构简介 word文档

    在Ruby中,字符串(String)是用于存储和操作字符序列的基本数据结构。字符串的声明方式多样,包括单引号、双引号及百分号标记的分隔符等,能够适应不同的编码需求和场景。其中,表达式置换功能允许将Ruby代码中的...

Global site tag (gtag.js) - Google Analytics