Pack/Unpack 和 Ruby 中的 base64

Pack/Unpack and base64 in Ruby

我有一个字符串 a = "hello"。我可以使用 unpack:

将它转换为 base 2 或 base 16
a.unpack('B*')
# => ["0110100001100101011011000110110001101111"]

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

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

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

但结果不是我所期望的。我认为如果我有一些二进制表示或字符串,要将它分成多个部分来表示,我应该使用 unpack。但事实并非如此。请帮我理解一下。

编码文本正确,使用以下在线工具验证:
https://www.base64encode.org/

文本:
你好

编码的 Base64:
aGVsbG8=

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

根据 OP 的澄清问题,"Why do we use #pack to get base64 and #unpack to get other representations of raw data?"

表面层面的原因是因为Array#pack是returns一个String的方法,而String#unpack是returns一个[=的方法15=]。

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

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

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

Base64是将数据数组封装(或"packing")为字符串