Как эффективно манипулировать двоичными числами в Crystal?

#binary #numbers #bitcoin #crystal-lang

Вопрос:

Я пытаюсь реализовать спецификацию биткойнов 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
 

Теперь, как я уже сказал, это работает, я могу взять двоичные строки и преобразовать их обратно в числа и продолжить, но это не может быть так. Мне интересно, какой более элегантный, более эффективный или более правильный способ подойти к этому?

Ответ №1:

Извините за краткий ответ, но я думаю, что вы ищете BitArray. Надеюсь, это послужит вам на пользу!