我正在尝试在ruby中的两个关键字符串上执行Bitwise XOR:
key1:0123456789abcdeffedcba9876543210
key2:00000000000000000000000000000000
有人可以告诉我该怎么做,谢谢。
答案 0 :(得分:8)
s1='0123456789abcdeffedcba9876543210'
s2='00000000000000000000000000000000'
xored = s1.unpack('C*').zip(s2.unpack('C*')).map{ |a,b| a ^ b }.pack('C*')
# => "\x00\x01\x02\x03\x04\x05\x06\a\b\tQRSTUVVUTSRQ\t\b\a\x06\x05\x04\x03\x02\x01\x00"
答案 1 :(得分:1)
有人可以告诉我该怎么做吗?
Ruby中的XOR运算符是^
。它可以用作按位和布尔值,具体取决于其参数(请记住^
是运算符和方法.^(x)
)。在默认类String
中,它不存在,但您可以自己轻松实现它:
class String
# converts to array of chars
def to_a
ret = []
self.each_char do |c|
ret.push c
end
return ret
end
# given two numeric strings,
# returns the bitwise xor string
def ^(s)
aa = self.to_a
ab = s.to_a
lc = (aa.count < ab.count) ? aa.count : ab.count
ret = ""
lc.times do |i|
x = aa[i].to_i ^ ab[i].to_i
ret = ret + x.to_s
end
return ret
end
end
这只是一个例子,尚未经过测试。
如果我要在执行逐位异或之前将每个字节转换为二进制。我该怎么做?
好的,您想查看String#bytes或String#each_byte并使用这些方法实现上述代码。