【发布时间】:2021-12-14 01:01:07
【问题描述】:
我正在尝试实现比特币规范 BIP-39,特别是 Generating the mnemonic 部分。以下是一些令人头疼的问题:
接下来,这些连接的位被分成 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
现在,正如我所说,它可以工作,我可以将二进制字符串转换回数字并继续,但这不可能。我想知道,有什么更优雅、更有效或更正确的方法来解决这个问题?
【问题讨论】:
标签: binary numbers bitcoin crystal-lang