我让这段代码工作,从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
但即使在阅读完文档之后,我也没有真正理解pack
和unpack
方法。具体来说,我对这两种实现之间的不对称感到困惑。从概念上讲,在这两种情况下,我们采用在某个基数(16或64)中编码的字符串,并且我们希望将其转换为另一个基数。那么为什么我们不能像这样实现to_hex
:
def to_hex
[[self].pack("m0")].pack("H*")
end
或to_base64
使用unpack
?为什么我们选择的基础完全改变了我们需要用来完成转换的方法?
答案 0 :(得分:12)
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")
self.unpack("m0").first
H*
:self.unpack("m0").first.unpack("H*")
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]
的倒数