Ruby не распознает оператор «^ =» - PullRequest
1 голос
/ 20 декабря 2011

У меня есть ruby ​​1.9.2dev (2010-07-02) [i486-linux].

Я знаю, что ^= является оператором ixor, как показано в официальной документации.

Это вывод, когда я запускаю скрипт из оболочки.

root@desk:~/Desktop/cha03# ./cha03
./cha03:35:in `block in <main>': undefined method `^' for "\x1C":String (NoMethodError)
    from ./cha03:35:in `each_byte'
    from ./cha03:35:in `each_with_index' 
    from ./cha03:35:in `<main>'

И эта строка выдает ошибку:

key.each_byte.each_with_index { |b,i| key[i] ^= subkey[i % 4] }

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

В ruby ​​1.9 string[some_index] больше не является байтовым значением, вместо этого будет строка

ruby-1.9.2-p180 :001 > '123'[2] => "3" 

Строка не имеет метода ^, поэтому вы получите ошибку, которую вы описали. В ruby ​​1.8.7 вы бы взяли значение байта, и все бы сработало. Я думаю, вам повезет больше, если вы используете unpack, чтобы превратить строку в массив байтов, манипулировать ею, а затем собрать все вместе, что-то вроде

bytes = key.unpack('C*')
bytes.each_with_index {|b,i| ... }
key = bytes.pack('C*')
1 голос
/ 20 декабря 2011

расширяющий класс String для возможности простого xor -еда с другой строкой или числом
пример использования:

#irb -E binary
ruby-1.9.3-p0 :021 > "foo".xor('bar')
 => "\x04\x0E\x1D" 
ruby-1.9.3-p0 :022 > "foo".xor(1)
 => "gnn"

class String
  def xor x
    if x.is_a?(String)
      r = ''
      j = 0
      0.upto(self.size-1) do |i|
        r << (self[i].ord^x[j].ord).chr
        j+=1
        j=0 if j>= x.size
      end
      r
    else
      r = ''
      0.upto(self.size-1) do |i|
        r << (self[i].ord^x).chr
      end
      r
    end
  end
end
...