gpt4 book ai didi

ruby - 使用 Ruby 压缩位串

转载 作者:数据小太阳 更新时间:2023-10-29 07:48:11 24 4
gpt4 key购买 nike

对于一个生物信息学项目,我需要将 Ruby 中的大量位串(仅包含 0 和 1 的字符串)压缩为较小的字符串以减少内存使用量。

理想情况下,像“0001010010010010010001001”这样的字符串会变成像“2a452c66”这样的字符串。我首先使用 MD5 哈希,直到我阅读了一些我想避免的可能的冲突。

我尝试了很多不同的 unpack、to_i、to_s 等组合,但似乎无法获得正确的组合。

解决方案应该:

  • 保留任何前导 0。
  • 可逆。
  • 压缩(显然)。
  • 并且输出应该避免奇怪的字符。最好我想留在字母数字空间。 (a-zA-Z0-9)。

谢谢!

最佳答案

尝试:

FORMAT = '%0.*b'

bitmask = "0001010010010010010001001"
bitmask.to_i(2) # => 2696329
hexval = bitmask.to_i(2).to_s(16) # => "292489"
FORMAT % [bitmask.size, hexval.to_i(16)] # => "0001010010010010010001001"

它的作用是:

  • to_i(2) 将字符串从二进制转换为其整数值,只是为了显示正在发生的事情。
  • to_i(2).to_s(16) 将其转换为十六进制表示形式的字符串。
  • FORMAT 包含一个 printf 格式字符串,表示将传入的值转换为其二进制字符串表示形式 (%b),前导 0 字节 (%0b),未知长度 (%0.*b),它从传递的第一个参数 (bitmask.尺寸).

这是另一个使用更长位掩码的示例:

bitmask = "11011110101011011011111011101111"

hexval = bitmask.to_i(2).to_s(16) # => "deadbeef"
FORMAT % [bitmask.size, hexval.to_i(16)] # => "11011110101011011011111011101111"

还有更长的时间:

bitmask = "1101111010101101101111101110111111111110111011011010110111011010"

hexval = bitmask.to_i(2).to_s(16) # => "deadbeeffeedadda"
FORMAT % [bitmask.size, hexval.to_i(16)] # => "1101111010101101101111101110111111111110111011011010110111011010"

关于ruby - 使用 Ruby 压缩位串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18236190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com