1

ruby の 2 つのキー文字列に対して Bitwise XOR を実行しようとしています。

key1 : 0123456789abcdeffedcba9876543210
key2: 000000000000000000000000000000

誰かがこれを行う方法を教えてください、ありがとう。

4

2 に答える 2

8

バイトにアンパックし、一緒に圧縮し、xor をマップし、再パックします。

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 演算子は^. 引数に応じて、ビット単位とブール値の両方として使用できます (これ^は operatormethodであることを思い出してください.^(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を見て、代わりにこれらのメソッドを使用して上記のコードを実装する必要があります。

于 2013-04-13T02:47:01.423 に答える