我正在尝试在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]
有人可以帮忙吗?或者有人可以提出另一种方法吗? 非常感谢
答案 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'
)的期望。