Битовый массив из строки - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть строка:

cipher = "0111101110010111001001010000000110101000001000111101110000110101100100001100101100000"

Я хочу нарезать ее и сохранить в массиве так: ["01111011", "10010111" ...]

Iпробовал этот код, но у меня есть ошибка:

"cz.rb: 16: in <main>': undefined method push 'для nil: NilClass (NoMethodError)"

i,j = 0,0
cipher_byte = []
while i < cipher.length
  if i != 0 and i % 8 == 0
   j+=1
  end
  cipher_byte[j].push(cipher[i])
  p cipher_byte
  i+=1
end

Что с этим не так? Это рубин.

Ответы [ 4 ]

8 голосов
/ 11 ноября 2019
cipher.scan(/.{8}/)
  #=> ["01111011", "10010111", "00100101", "00000001", "10101000",
  #    "00100011", "11011100", "00110101", "10010000", "11001011"]
4 голосов
/ 11 ноября 2019

Самый простой:

cipher.each_char.each_slice(8).map(&:join)

Быстрее:

(0...cipher.length).step(8).map { |i| cipher[i, 8] }

Меньше кода означает меньше мест, где может скрываться ошибка (до тех пор, пока код остается читаемым). Ruby предоставляет множество идиом и методов, которые делают программист интуитивно понятным и простым. while петля со счетчиком редко бывает рубиновой;while цикл с безусловно увеличивающимся счетчиком никогда не будет.

3 голосов
/ 11 ноября 2019

Вы индексируете пустой массив (cipher_byte) и получаете ноль. Затем вызывая push для экземпляра nil

. Вам нужно будет создавать новый массив каждые итерации и т. Д., А затем передавать этот подмассив в основной массив.

0 голосов
/ 11 ноября 2019

Вы пытаетесь нажать на cipher_byte[j], который, как показывает ошибка, еще не установлен в значение. (На первой итерации цикла вы можете представить, что cipher_byte имеет длину 0, поскольку он установлен на []. Следовательно, вы пока не можете индексировать его, используя [j].)

Выможет хотеть cipher_byte.push, вместо того, чтобы пытаться подтолкнуть к определенной позиции. В Ruby .push в массиве добавит это значение в конец массива;вам не нужно ссылаться на эту позицию с j.

...