4

一个半字节是四位。这意味着有 16 (2^4) 个可能的值。这意味着一个半字节对应一个十六进制数字,因为十六进制是基数 16。一个字节是 2^8,因此可以用 2 个十六进制数字表示,因此可以用 2 个半字节表示。

所以下面我有一个 1 字节的字符:

'一个'

那个字符是 2^8:

 'A'.unpack('B*')
 => ["01000001"] 

这意味着它应该由两个十六进制数字表示:

 01000001 == 41

根据 Ruby 文档,对于 Array 方法包,当 aTemplateString(参数)等于 'H' 时,它将返回一个十六进制字符串。但这就是我得到的:

['A'].pack('H')
 => "\xA0" 

我的第一点是这不是它应该返回的十六进制值。它应该返回 41 的十六进制值。第二点是半字节的概念,正如我在上面解释的,意味着对于 1 个字节,它应该返回两个半字节。但是在它上面插入了一个 0,因为它认为输入只有 1 个半字节,即使“A”是一个字节并且有两个半字节。很明显,我在这里遗漏了一些东西。

4

2 回答 2

10

我想你想要unpack

'A'.unpack('H*') #=> ["41"]

pack做相反的事情:

['41'].pack('H*') #=> "A"
于 2013-06-20T20:18:28.277 回答
0

这很棘手。["1"].pack("H") => "\x10" 和 ["16"].pack("H") => "\x10"。我花了很长时间才明白这一点。

于 2015-03-19T07:41:44.613 回答