Ruby String#unpack

从一个例子开始:如何将一个字符串转化成一个十六进制的串。一种方法是使用字符串的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
   -------+---------+-----------------------------------------

 

Lua 中的 `string.pack` 和 `string.unpack` 函数是用于将数据打包成二进制数据和从二进制数据中解析出数据的函数。这两个函数通常用于网络通信、文件存储等需要将数据转换为二进制数据的场景。 `string.pack` 函数将多个参数按照指定的格式字符串进行打包,并返回一个二进制字符串。格式字符串中可以包含各种类型的占位符,例如 `%d` 表示一个整数、`%f` 表示一个浮点数、`%s` 表示一个字符串等。打包时,每个占位符对应一个参数,按顺序进行打包。示例如下: ```lua local data = string.pack("c4ihfd", "test", 1234, 5678, 3.14, 2.718) ``` 在这个示例中,格式字符串 `"c4ihfd"` 包含了 6 个占位符,分别表示一个长度为 4 的字符串、一个短整数、一个整数、一个双精度浮点数和一个单精度浮点数。`string.pack` 函数接收 6 个参数,按照顺序进行打包,并返回一个二进制字符串。 `string.unpack` 函数将一个二进制字符串按照指定的格式字符串进行解析,并返回解析出的值。格式字符串和 `string.pack` 函数中的格式字符串相同。解析时,每个占位符对应一个返回值,按顺序进行解析。示例如下: ```lua local str, i, j, x, y = string.unpack("c4ihfd", data) ``` 在这个示例中,`string.unpack` 函数接收一个格式字符串和一个二进制字符串作为参数,解析出 5 个值,并按顺序返回。 需要注意的是,在使用 `string.pack` 和 `string.unpack` 函数时,需要按照指定的格式字符串进行打包和解析,否则可能会导致数据解析错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值