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=
根据 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")为字符串
我有一个字符串 a = "hello"
。我可以使用 unpack
:
a.unpack('B*')
# => ["0110100001100101011011000110110001101111"]
a.unpack('H*')
# => ["68656c6c6f"]
要转换为 base 64,我尝试了 pack
:
[a].pack('m0')
# => "aGVsbG8="
但结果不是我所期望的。我认为如果我有一些二进制表示或字符串,要将它分成多个部分来表示,我应该使用 unpack
。但事实并非如此。请帮我理解一下。
编码文本正确,使用以下在线工具验证:
https://www.base64encode.org/
文本:
你好
编码的 Base64:
aGVsbG8=
根据 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")为字符串