2011-12-20 2 views
1

私はruby 1.9.2dev(2010-07-02)[i486-linux]を持っています。Rubyは "^ ="演算子を認識しません

^=は公式ドキュメントに示されているようにixor演算子であることがわかりました。

これは、シェルからスクリプトを実行したときの出力です。

[email protected]:~/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>' 

そして、これはエラーになりますラインではありません:ルビー1.9で

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

感謝を –

+0

問題を示す 'key'と' subkey'の定義例を追加できますか?私はストリングでないことの「キー」を強く疑う。 – phihag

答えて

2

string[some_index]はもはやバイト値である、それは代わりに、文字列

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

文字列のdoesntになります^メソッドがあるので、記述したエラーが発生します。 Ruby 1.8.7では、代わりにバイトの値を取得していて、それはすべて機能していました。私はあなたがxor簡単にできるように、クラスStringを拡張

1

の線に沿って何かを、バイト配列に文字列を入れ、その後戻って一緒にすべてを置くことを操作するために、unpackを使用して、より良い運を持っていると思います別の文字列または数
使用例と-ed:すべてのヒントについて

#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 
関連する問題