在ruby中对2个字符串执行按位异或

时间:2013-04-13 02:03:20

标签: ruby bit-manipulation xor

我正在尝试在ruby中的两个关键字符串上执行Bitwise XOR:

key1:0123456789abcdeffedcba9876543210
key2:00000000000000000000000000000000

有人可以告诉我该怎么做,谢谢。

2 个答案:

答案 0 :(得分:8)

Unpack输入字节,压缩,映射xor,重新pack

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#bytesString#each_byte并使用这些方法实现上述代码。