我让这段代码工作,它从十六进制转换为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
但是,即使在阅读了文档之后,我也没有真正摸索出
pack
和unpack
方法。具体来说,我对两种实现之间的不对称性感到困惑。从概念上讲,在这两种情况下,我们都采用一个以某个基(16或64)编码的字符串,并希望将其转换为另一个基。为什么我们不能像这样实现to_hex
:def to_hex
[[self].pack("m0")].pack("H*")
end
或者使用
to_base64
?为什么我们选择的基础会完全改变我们完成转换所需的方法? 最佳答案
to_hex
与to_base64
正好相反:to_base64
将字符串放入数组:[self]
带有H*
的呼叫包:[self].pack("H*")
将字符串放入数组:[[self].pack("H*")]
带有m0
的呼叫包:[[self].pack("H*")].pack("m0")
to_hex
使用m0
:self.unpack("m0")
调用unpack
从数组中提取字符串:self.unpack("m0").first
使用H*
:self.unpack("m0").first.unpack("H*")
调用unpack
从数组中提取字符串: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]
的倒数。