ruby の 2 つのキー文字列に対して Bitwise XOR を実行しようとしています。
key1 : 0123456789abcdeffedcba9876543210
key2: 000000000000000000000000000000
誰かがこれを行う方法を教えてください、ありがとう。
ruby の 2 つのキー文字列に対して Bitwise XOR を実行しようとしています。
key1 : 0123456789abcdeffedcba9876543210
key2: 000000000000000000000000000000
誰かがこれを行う方法を教えてください、ありがとう。
バイトにアンパックし、一緒に圧縮し、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"
誰かがこれを行う方法を教えてもらえますか?
Ruby の XOR 演算子は^
. 引数に応じて、ビット単位とブール値の両方として使用できます (これ^
は operatorとmethodであることを思い出してください.^(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を見て、代わりにこれらのメソッドを使用して上記のコードを実装する必要があります。