我有一个字符串a = "hello"
。我可以使用 unpack
将它转换为 base 2 或 base 16:
a.unpack('B*')
# => ["0110100001100101011011000110110001101111"]
a.unpack('H*')
# => ["68656c6c6f"]
要转换为 base 64,我尝试了 pack
:
[a].pack('m0')
# => "aGVsbG8="
但结果不是我所期望的。我想如果我有一些二进制表示或字符串,要将它分成多个部分来表示,我应该使用 unpack
。但事实并非如此。请帮助我理解它。
最佳答案
根据 OP 的澄清问题,“为什么我们使用 #pack
获取 base64 并使用 #unpack
获取原始数据的其他表示形式?”
表面层面的原因是因为 Array#pack
是一个返回 String
的方法,而 String#unpack
是一个返回字符串的方法一个数组
。
这背后有更强大的概念原因。关键原则是 base64 不是原始字节数组。相反,它是一个 7 位 ASCII 安全字符串,如果正确(反)编码,它可以表示任意字节。
每个 base64 字符映射到一个六位序列。在字节级别,字符与原始字节的比例为 4:3。由于 2 的整数次方不能除以 3,所以我们通常会用填充结束,并且您不能在任意位置对 base64 进行切片以从中获取字节范围(您必须弄清楚哪些字节你想要三人一组,然后以四人一组的方式获取相关的 base64 字符)。
从根本上说,任意数据序列都是字节数组。 Base64 编码的序列从根本上说是字符串:数据序列被限制在字节范围内,可以作为文本安全传输和显示。
Base64 是将数据数组封装(或“打包”)为字符串。
关于ruby - 在 Ruby 中打包/解包和 base64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44037172/