我有一个字符串a = "hello"
。我可以使用unpack
将其转换为base 2或base 16:
a.unpack('B*')
# => ["0110100001100101011011000110110001101111"]
a.unpack('H*')
# => ["68656c6c6f"]
要转换为base 64,我尝试了pack
:
[a].pack('m0')
# => "aGVsbG8="
但结果不是我的预期。我认为如果我有一些二进制表示或字符串,以分开的方式表示它,我应该使用unpack
。但事实证明并非如此。请帮我理解。
答案 0 :(得分:2)
答案 1 :(得分:1)
每个OP明确的问题:“为什么我们使用#pack
来获取base64,而为什么使用#unpack
来获取原始数据的其他表示形式?”
表面水平面的原因是因为Array#pack
是一种返回String
的方法,而String#unpack
是一种返回Array
的方法。
存在更强的概念上的原因。关键原理是base64不是原始字节的数组。而是一个7位ASCII安全的字符串,如果正确(解码)了它,则可以表示任意字节。
每个base64字符映射到六个位的序列。在字节级别,字符与原始字节的比率为4:3。由于2的整数次幂不会除以3,因此最终导致填充的次数更多,而且您无法在任意位置对base64进行切片以从中获取字节范围(您必须找出哪些字节)您希望以三个为一组,并以四个为一组来获取相关的base64字符。
数据的任意序列基本上是字节数组。从根本上说,以Base64编码的序列是字符串:限制在安全传输和显示为文本的字节范围内的数据序列。
Base64是将数据数组封装(或“打包”)为字符串。