【问题标题】:Why is hex -> base64 so different from base64 -> hex using pack and unpack?为什么使用打包和解包的 hex -> base64 与 base64 -> hex 如此不同?
【发布时间】:2013-09-26 05:45:34
【问题描述】:

我得到了这段代码,它从十六进制转换为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?为什么我们选择的基础完全改变了我们完成转化所需的方法?

【问题讨论】:

    标签: ruby arrays pack unpack


    【解决方案1】:

    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调用解包:self.unpack("m0")
    2. 从数组中提取字符串:self.unpack("m0").first
    3. H*调用解包:self.unpack("m0").first.unpack("H*")
    4. 从数组中提取字符串:self.unpack("m0").first.unpack("H*").first

    这就是您撤消操作的方式,通过应用 inverse 操作:

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

    反之亦然:

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-21
      • 2021-08-17
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 2020-08-16
      • 2014-06-05
      相关资源
      最近更新 更多