7

我得到了这段代码,它从十六进制转换为base64,反之亦然。我是to_base64从另一个 SO question 中得到的,我写to_hex了一些猜测和反复试验。

class String

  def to_base64
    [[self].pack("H*")].pack("m0")
  end

  def to_hex
    self.unpack("m0").first.unpack("H*").first
  end
end

但即使在阅读文档之后,我也并不真正了解packand方法。unpack具体来说,我对这两种实现之间的不对称感到困惑。从概念上讲,在这两种情况下,我们都采用以某个基数(16 或 64)编码的字符串,并且我们希望将其转换为另一个基数。那么为什么我们不能这样实现to_hex

def to_hex
  [[self].pack("m0")].pack("H*")
end

to_base64使用unpack?为什么我们选择的基础完全改变了我们完成转换所需的方法?

4

1 回答 1

13

to_hex是 的精确倒数to_base64

to_base64

  1. 将字符串放入数组中:[self]
  2. 调用包H*[self].pack("H*")
  3. 将字符串放入数组中:[[self].pack("H*")]
  4. 调用包m0[[self].pack("H*")].pack("m0")

to_hex

  1. 调用解包m0self.unpack("m0")
  2. 从数组中提取字符串:self.unpack("m0").first
  3. 调用解包H*self.unpack("m0").first.unpack("H*")
  4. 从数组中提取字符串:self.unpack("m0").first.unpack("H*").first

这就是您撤消操作的方式,通过应用操作:

a = 5
(a + 4) * 3
#=> 27

反之亦然:

a = 27
(a / 3) - 4
#=> 5

a.pack是的倒数a.unpack并且a.first是的倒数[a]

于 2013-09-20T18:57:46.817 回答