2011-12-20 112 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