2011-12-20 113 views
1

我有紅寶石1.9.2dev(2010-07-02)[1486-Linux的]。紅寶石無法識別 「^ =」 運算符

我知道^=是ixor操作如圖所示的官方文檔。

這是當我運行從shell腳本輸出。

[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>' 

這是使該錯誤的行:

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

感謝所有的提示 – 2011-12-20 17:52:04

+0

你可以添加一個'key'和'subkey'的示例定義來展示問題嗎?我強烈懷疑'鍵'不是一個字符串。 – phihag 2011-12-20 17:56:28

回答

2

在紅寶石1.9 string[some_index]不再是字節值,這反而是一個字符串

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

字符串犯規有一個^方法,所以你得到你所描述的錯誤。在紅寶石1.8.7中,你會得到字節的值,它會一直工作。我想你會使用解包打開字符串轉換成字節數組,操作這些然後把它全部重新走到一起,沿着

1

擴展String類線的東西要能夠容易xor有更好的運氣用另一個字符串或數字
例如使用-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