Ruby按位xor 2相同长度的ascii字符串

时间:2014-03-14 19:46:24

标签: ruby bit-manipulation

我正在尝试在ruby中执行相同长度的按位xor 2 ASCII字符串。我来了以下:

'A'.unpack('B*').zip('B'.unpack('B*')).map{|a, b| (a.to_i ^ b.to_i).to_s}.pack('b*')
 => "\003"

有效。但是,当执行2个或更多字符的字符串时,它表现得很糟糕,我认为因为Fixnum的值太大,请参见下文:

'AA'.unpack('B*').zip('BB'.unpack('B*')).map{|a, b| (a.to_i ^ b.to_i).to_s}.pack('b*')
 => "_\003"

如果我在xor之后停止,没有to_s部分,我发现它没有正确执行按位XOR:

'AA'.unpack('B*').zip('BB'.unpack('B*')).map{|a, b| (a.to_i ^ b.to_i)}
 => [1515925259] 

有人可以帮忙吗?或者有人可以提出另一种方法吗? 非常感谢

1 个答案:

答案 0 :(得分:2)

我认为您希望unpack使用C(8位无符号)而不是B(位字符串),因为xor运算符^对数字进行操作而不是字符串:

'AA'.unpack('C*').zip('BB'.unpack('C*')).map { |a,b| a^b }.pack('C*')
# => "\x03\x03"

3是人们对xoring 65('A')与66('B')的期望。