我有一些二进制数据,我想将其转换为更易于阅读和复制/粘贴的内容。
二进制数据是这样显示的
?Q?O?,???W%ʐ):?g????????
这很丑陋。我可以将它转换为十六进制:
value.unpack("H*").first
但是因为十六进制只有 16 个字符,所以它不是很压缩。我最终得到了一个长达数百个字符的字符串。
我更喜欢使用字母(大写和小写)、数字和基本符号的格式,以充分利用可能的值。我可以使用什么?
我还更喜欢 Ruby 内置的东西,不需要其他库。不幸的是,我不能要求另一个库,除非它真的广为人知和流行,或者理想地内置到 Ruby 中。
我尝试了 http://apidock.com/ruby/String/unpack 中的内容却找不到任何东西。
最佳答案
一种简单的方法使用 Base64 编码对值进行编码。它与 Hex 编码(即 Base16)非常相似,但使用了更长的字典。
Base64 字符串,如果准备得当,只包含可打印的字符。这有利于复制/粘贴和共享。
第二个好处是它具有 3:4 的编码比,这意味着它相当高效。 3:4 的编码比例意味着输入中每 3 个字节使用 4 个字节进行编码(效率为 75%);十六进制编码是一种效率较低的 1:2 编码比例,或者对于输入的每 1 个字节,使用 2 个字节进行编码(效率为 50%)。
您可以使用 Ruby 标准库 Base64实现编码和解码,像这样:
require "base64"
encoded = Base64.encode64("Taste the thunder!") # <== "VGFzdGUgdGhlIHRodW5kZXIh\n"
decoded = Base64.decode64(encoded) # <== "Taste the thunder!"
请注意,还有一个(大部分)URL 安全版本,因此您可以在 URL 中的任何位置包含编码值,而无需任何额外的 URL 编码。这将允许您以模糊的方式在 URL 中传递信息,尤其是通常不容易以这种方式传递的信息。
试试这个来编码你的数据:
encoded_url_param = Base64.urlsafe_encode64("cake+pie=yummy!") # <== "Y2FrZStwaWU9eXVtbXkh"
decoded_url_param = Base64.urlsafe_decode64(encoded_url_param) # <== "cake+pie=yummy!"
在 URL 中使用 Base64,虽然实际上不是“安全”,但有助于防止窥探您的数据和意图。在 URL 中使用 Base64 值的唯一潜在缺点是 URL 必须保持区分大小写,而某些应用程序不满足该要求。查看Should URL be case sensitive SO 问题以获取更多信息。
关于ruby - 使用 Ruby,如何将二进制数据转换为高度压缩但可读的格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37044446/