【问题标题】:Pack/Unpack and base64 in RubyRuby 中的打包/解包和 base64
【发布时间】:2017-10-17 15:26:25
【问题描述】:

我有一个字符串a = "hello"。我可以使用 unpack 将其转换为 base 2 或 base 16:

a.unpack('B*')
# => ["0110100001100101011011000110110001101111"]

a.unpack('H*')
# => ["68656c6c6f"]

要转换为base 64,我尝试了pack

[a].pack('m0')
# => "aGVsbG8="

但结果不是我所期望的。我想如果我有一些二进制表示或字符串,要分部分表示它,我应该使用unpack。但事实证明并非如此。请帮助我理解它。

【问题讨论】:

  • 这是base64的样子;它使用 6 位字符来编码 8 位流(基本上每 3 个字节 4 个字符)。你期待什么?
  • Sawa 错误地编辑了我的问题。我的期望不是结果,期望是为什么我们使用 pack 转换为 base64 并使用 unpack 为 base16 和 base2

标签: ruby base64 pack unpack


【解决方案1】:

编码后的文字是否正确,请使用以下在线工具进行验证:
https://www.base64encode.org/

文字:
你好

Base64 编码:
aGVsbG8=

有用资源:
https://idiosyncratic-ruby.com/4-what-the-pack.html

【讨论】:

  • 感谢您的回答。但我的源问题不是关于 pack 的结果(Sawa 错误地编辑了我的问题)。我真正的问题是关于为什么将字符串/二进制转换为 base64 Ruby 使用 pack,但转换为 base2 或 base16 它使用 unpack。为什么不a.unpack('m0'),例如
【解决方案2】:

根据 OP 的澄清问题,“为什么我们使用 #pack 来获取 base64 和 #unpack 来获取原始数据的其他表示形式?”

表面原因是因为Array#pack是返回String的方法,而String#unpack是返回Array的方法。

这背后有更强有力的概念原因。关键原则是 base64 不是原始字节数组。相反,它是一个 7 位 ASCII 安全字符串,如果正确(解码)编码,则可以表示任意字节。

每个 base64 字符映射到一个六位序列。在字节级别,字符与原始字节的比率为 4:3。由于 2 的整数幂不能除以 3,因此我们最终会经常使用填充,并且您不能在任意位置对 base64 进行切片以从中获取字节范围(您必须弄清楚哪些字节你想要三人一组,然后以四人一组的方式获取相关的 base64 字符)。

任意数据序列基本上是字节数组。 Base64 编码的序列基本上是字符串:数据序列被限制在可以安全传输和显示为文本的字节范围内。

Base64 是将数据数组封装(或“打包”)为字符串。

【讨论】:

    猜你喜欢
    • 2011-01-16
    • 2013-09-26
    • 2011-10-27
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多