为什么hex – > base64与base64 – > hex使用pack和unpack有什么不同?

我得到了这段代码,它从hex转换为base64,反之亦然。 我从另一个SO问题得到了to_base64 ,我写了一些猜测和反复试验的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 

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

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

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

to_hexto_base64完全相反:

to_base64

  1. 把字符串放在一个数组中: [self]
  2. 带有H*呼叫包: [self].pack("H*")
  3. 把字符串放在一个数组中: [[self].pack("H*")]
  4. 使用m0调用包: [[self].pack("H*")].pack("m0")

to_hex

  1. m0调用unpack: self.unpack("m0")
  2. 从数组中提取字符串: self.unpack("m0").first
  3. H*调用unpack: 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.packa.pack的反转, a.unpack[a]的反转