为什么是hex - > base64与base64不同 - >十六进制使用包装和拆包?

时间:2013-09-20 18:30:35

标签: ruby arrays 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

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

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

1 个答案:

答案 0 :(得分:12)

to_hexto_base64完全相反:

to_base64

  1. 将字符串放入数组:[self]
  2. 使用H*[self].pack("H*")
  3. 的通话包
  4. 将字符串放入数组:[[self].pack("H*")]
  5. 使用m0[[self].pack("H*")].pack("m0")
  6. 的通话包

    to_hex

    1. 使用m0self.unpack("m0")
    2. 致电解压缩
    3. 从数组中提取字符串:self.unpack("m0").first
    4. 使用H*self.unpack("m0").first.unpack("H*")
    5. 致电解压缩
    6. 从数组中提取字符串:self.unpack("m0").first.unpack("H*").first
    7. 这是通过应用操作来撤消操作的方法:

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

      反过来说:

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

      a.packa.unpack的倒数,a.first[a]的倒数