Ruby中的打包/解包和base64

时间:2017-05-18 01:30:17

标签: ruby base64 pack unpack

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

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

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

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

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

但结果不是我的预期。我认为如果我有一些二进制表示或字符串,以分开的方式表示它,我应该使用unpack。但事实证明并非如此。请帮我理解。

2 个答案:

答案 0 :(得分:2)

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

文字:

编码Base64:
aGVsbG8 =

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

答案 1 :(得分:1)

每个OP明确的问题:“为什么我们使用#pack来获取base64,而为什么使用#unpack来获取原始数据的其他表示形式?”

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

存在更强的概念上的原因。关键原理是base64不是原始字节的数组。而是一个7位ASCII安全的字符串,如果正确(解码)了它,则可以表示任意字节。

每个base64字符映射到六个位的序列。在字节级别,字符与原始字节的比率为4:3。由于2的整数次幂不会除以3,因此最终导致填充的次数更多,而且您无法在任意位置对base64进行切片以从中获取字节范围(您必须找出哪些字节)您希望以三个为一组,并以四个为一组来获取相关的base64字符。

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

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