红宝石无法识别 “^ =” 运算符
问题描述:
我有红宝石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] }
答
在红宝石1.9 string[some_index]
不再是字节值,这反而是一个字符串
ruby-1.9.2-p180 :001 > '123'[2] => "3"
字符串犯规有一个^方法,所以你得到你所描述的错误。在红宝石1.8.7中,你会得到字节的值,它会一直工作。我想你会使用解包打开字符串转换成字节数组,操作这些然后把它全部重新走到一起,沿着
答
扩展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
感谢所有的提示 – 2011-12-20 17:52:04
你可以添加一个'key'和'subkey'的示例定义来展示问题吗?我强烈怀疑'键'不是一个字符串。 – phihag 2011-12-20 17:56:28