为什么使用pack和unpack进行十六进制转换为base64与base64转换为十六进制如此不同?

7

我已经让这段代码正常运行了,它可以将十六进制转换为base64,也可以将base64转换为十六进制。我从Stack Overflow上找到了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

使用unpack或者to_base64,为什么我们选择的基数会完全改变我们需要使用的转换方法呢?
1个回答

13

to_hexto_base64 的精确反向操作:

to_base64

  1. 将字符串放入数组中:[self]
  2. 使用 H* 调用 pack 方法:[self].pack("H*")
  3. 将字符串放入数组中:[[self].pack("H*")]
  4. 使用 m0 调用 pack 方法:[[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.unpack 的相反操作,a.first[a] 的相反操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接