1

我正在尝试对 ruby​​ 中的两个键字符串执行按位异或:

键1:0123456789abcdeffedcba9876543210
键2:00000000000000000000000000000000

有人可以告诉我如何做到这一点,谢谢。

4

2 回答 2

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"
于 2013-04-13T04:57:45.233 回答
1

有人可以告诉我该怎么做吗?

Ruby 中的 XOR 运算符是^. 它可以用作按位和布尔值,具体取决于它的参数(请记住,它^是一个运算符一个方法.^(x))。在默认类String中 is 不存在,但您可以轻松地自己实现它:

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并用这些方法来实现上面的代码。

于 2013-04-13T02:47:01.423 回答