ruby - 在 Ruby 中打包/解包和 base64

标签 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。但事实并非如此。请帮助我理解它。

最佳答案

根据 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/

相关文章:

PHP 的 pack 函数的 Java 等价物

c++ - 如何返回嵌套在其他包中的模板包?

ruby-on-rails - 如何在 Rails 3.2 中使用 React 生态系统?

python - 为什么 ruby​​ `require` 不是更细粒度的?

ruby-on-rails - 发出 API 请求,将响应放入 RAILS 4.0.0

java - 上传图片,编码为base64 Spring MVC

ruby - 在 watir-webdriver 中的另一个元素的同一段落中定位元素

asp.net - 如何从 URL 的 Modified Base64 中删除填充?

delphi - 将 Base64 转换为位图

javascript - 将 PHP 代码转换为 Javascript(内爆、打包和解包)