如何在水晶有效地操纵二进制数?



我正在尝试实现比特币规范BIP-39,特别是生成助记符的部分。以下内容会导致一些头痛:

接下来,这些连接的位被分成11位一组,每组编码0-2047之间的一个数字,作为单词列表的索引。最后,我们将这些数字转换成单词,并使用连接的单词作为助记语句。

将二进制数分成11位的组。但是我如何在Crystal中有效地做到这一点呢?

我是这样做的,我个人觉得这有点尴尬,但不可否认它是有效的:

seed = "87C1B129FBADD7B6E9ABC0A9EF7695436D767AECE042BEC198A97E949FCBE14C0d"
# => "87C1B129FBADD7B6E9ABC0A9EF7695436D767AECE042BEC198A97E949FCBE14C0d"
bin = BigInt.new(seed, 16).to_s(2)
# => "100001111100000110110001001010011111101110101101110101111011011011101001101010111100000010101001111011110111011010010101010000110110110101110110011110101110110011100000010000101011111011000001100110001010100101111110100101001001111111001011111000010100110000001101"
iter = 0
size = 11
while iter < bin.size
p bin[iter, size]
# => "10000111110"
# [...]
end

现在,就像我说的,它可以工作,我可以把二进制字符串转换回数字,然后继续,但这不是它。我想知道,什么是更优雅,更有效,或更正确的方法来解决这个问题?

抱歉简洁的答案,但我认为你正在寻找的是BitArray。希望它对你有用!

最新更新