【问题标题】:Bit array from string来自字符串的位数组
【发布时间】:2020-03-06 17:31:34
【问题描述】:

我有一个字符串:

cipher = "0111101110010111001001010000000110101000001000111101110000110101100100001100101100000"

我想将它切片并存储在这样的数组中: ["01111011", "10010111" ... ]

我试过这段代码,但我有一个错误:

"cz.rb:16:in <main>': undefined methodpush' for 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

这有什么问题? 是红宝石。

【问题讨论】:

  • 您的 cipher 字符串包含 85 个字符。剩下的5个字符应该怎么处理?
  • @KarolMazurek :检查j 的值。我敢打赌,在错误发生时它是cipher_byte 数组之外的索引。

标签: arrays ruby string byte bit


【解决方案1】:
cipher.scan(/.{8}/)
  #=> ["01111011", "10010111", "00100101", "00000001", "10101000",
  #    "00100011", "11011100", "00110101", "10010000", "11001011"]

【讨论】:

  • 请注意,如果不能被八整除,此解决方案会忽略尾随字符。
【解决方案2】:

最简单:

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

更快:

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

更少的代码意味着可以隐藏错误的地方更少(只要代码仍然可读)。 Ruby 提供了许多惯用语和方法,使程序员的事情变得非常直观和容易。带有计数器的while 循环很少是Rubyish。带有无条件递增计数器的 while 循环永远不会。

【讨论】:

    【解决方案3】:

    您正在索引一个空数组 (cipher_byte) 并获得 nil。然后在 nil 的实例上调用 push

    您需要在每个 etc 迭代中创建一个新数组,然后将该子数组推送到主数组。

    【讨论】:

    • 又名,将cipher_byte[j] ||= [] 放在cipher_byte[j].push(cipher[i]) 行之前。如果当前为假,则将当前的cipher_byte[j] 分配给一个空数组。
    【解决方案4】:

    您正在尝试推送到cipher_byte[j],正如错误告诉您的那样,它尚未设置为值。 (在循环的第一次迭代中,您可以想象 cipher_byte 的长度为 0,因为它设置为 []。因此,您还不能使用 [j] 对其进行索引。)

    您可能想要cipher_byte.push,而不是试图推到特定位置。在 Ruby 中,数组上的.push 会将那个值添加到数组的末尾;您无需使用 j 引用该位置。

    【讨论】:

    • “你还不能使用 [j] 来索引它”——你可以。如果索引超出范围,Array#[] 将返回 nil。这就是为什么 OP 为nil 而不是IndexError 获得NoMethodError
    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2013-01-03
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多