`

Ruby String#unpack

    博客分类:
  • Ruby
阅读更多

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

res = []
"abc".each_byte {|i| res << i}
res.map {|i| i.to_s(16)}


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

"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
   -------+---------+-----------------------------------------

 

2
2
分享到:
评论
2 楼 sevk 2013-12-25  
RednaxelaFX 写道
嗯String#unpack和Array#pack这对东西使得Ruby操作二进制数据也很方便(虽然效率不一定有多好……)


ruby2.0 效率还行
1 楼 RednaxelaFX 2010-06-01  
嗯String#unpack和Array#pack这对东西使得Ruby操作二进制数据也很方便(虽然效率不一定有多好……)

相关推荐

    Lua UnPack函数用法实例

    在Lua编程语言中,unpack函数是一个非常实用且高效的工具,它主要用于从数组类型的table中解包元素。在本文中,我们将详细介绍unpack函数的用法,包括它的基本功能和如何通过实例来掌握它的使用技巧。 首先,让我们...

    ruby 2.3.1 windows64位安装包

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

    string-unpack-code.rar_The Test

    This test case unpacks the compressed code for the MochiKit, jQuery, Dojo and Prototype JavaScript libraries.

    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 提供了与文件系统和输入/输出操作相关...

    sap-me-pack-unpack-how-to-guide-en.pdf

    ### SAP ME Pack and Unpack功能设置与使用指南 #### 概述 本指南旨在为用户提供关于如何在SAP Manufacturing Execution (SAP ME)系统中设置和使用Pack与Unpack功能的详细步骤。此功能主要用于处理制造过程中产品...

    前端开源库-rsa-unpack

    "rsa-unpack"就是这样一个专为前端开发者设计的开源库,它专注于RSA解包,特别是从PEM(Privacy Enhanced Mail)格式的字符串中提取RSA密钥字段。 RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard ...

    Quick_Unpack_v2.0final

    《快速解压工具Quick_Unpack_v2.0final详解及应用》 在计算机技术领域,文件的压缩与解压是一项基础且重要的操作。压缩能够节省存储空间,方便传输,而解压缩则是恢复原始数据的关键步骤。本文将详细介绍一款名为...

    解析二进制流接口应用实例 pack、unpack、ord 函数使用方法

    pack和unpack是用于数据打包和解包的函数,而ord函数则是用来获取字符的ASCII码值。接下来,将从这几个方面深入解析这些知识点。 pack函数是PHP中的内置函数,它主要用于将数据打包成二进制字符串。pack函数的主要...

    Ruby on Rail 基础知识 一张纸

    - `unpack`: 解包字符串。 - `upcase!`: 转换所有字符为大写。 - `upto`: 用于遍历范围内的数值。 2. **正则表达式方法**: - `escape`: 转义特殊字符。 - `last_match`: 返回最近一次匹配的对象。 - `new`: ...

    mp-unpack mp-unpack

    "mp-unpack mp-unpack" 这个标题和描述似乎在重复同一个关键词,可能是由于某种原因导致信息不完整。不过,我们可以根据“mp-unpack”这个标签来推测这是关于一个用于解压或处理MP格式文件的工具或者命令。在IT领域...

    unpack_plist_2.py

    把脚本unpack_plist_2.py和图集文件xx_1.png、xx_1.plist、xx_2.png、xx_2.plist....放入同一个文件夹(可放多套图集),然后执行脚本,拆解后的小图在该文件夹下生成xx_1、xx_2...等对应的文件夹中

    Quick Unpack.v2.2 汉化版

    Quick Unpack v2.2 汉化版,全能脱壳工具,csdn上的都是汉化失败,乱码,没法用,就自己从新汉化,测试完成,下载请评价!

    unpack.zip

    本“unpack.zip”压缩包就是针对这一需求提供的一个资源包,它可以帮助我们理解并分析小程序的内部结构。 1. **小程序的结构** 小程序是由一系列的JSON配置文件、WXML(结构层)文件、WXSS(样式层)文件和...

    RescoBackup Unpack Tool v1[1].0 绿色汉化版

    Resco Backup Unpack Tool v1.0 是一款专为Resco Backup备份文件设计的实用工具,旨在帮助用户方便地解压和管理Resco Backup的备份组文件。这款绿色汉化版意味着它无需安装,直接运行即可,且界面及操作指南已经翻译...

    opengl manpages

    # unpack (you need the ncompress package for this to work) tar xf mangl.tar.Z release/xc/doc/man tar xf manglu.tar.Z release/xc/doc/man tar xf manglx.tar.Z release/xc/doc/man # configure and make ...

    Python struct.unpack

    使用struck.unpack获取子字符串 复制代码 代码如下:import struct print struct.unpack(format, ‘Test astring’) #(‘Test’, ‘ing’) 来个简单的例子吧,有一个字符串’He is not very happy’,处理一下,把...

    webRTC_m79版本AECDump分析所用unpack_aecdump文件

    webRTC_m79版本AECDump分析所用unpack_aecdump文件,注意该文件需要在linux环境下运行。

Global site tag (gtag.js) - Google Analytics