我正在尝试在 ruby 中对相同长度的 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"
如果我在异或之后停止,没有 to_s 部分,我会发现它没有正确执行按位异或:
'AA'.unpack('B*').zip('BB'.unpack('B*')).map{|a, b| (a.to_i ^ b.to_i)}
=> [1515925259]
有人可以帮忙吗?或者有人可以建议另一种方法来做到这一点? 非常感谢
最佳答案
我认为您想使用C
(8位无符号)而不是B
(位字符串)来解包
,因为异或运算符^
对数字而不是字符串进行操作:
'AA'.unpack('C*').zip('BB'.unpack('C*')).map { |a,b| a^b }.pack('C*')
# => "\x03\x03"
3 是 65 ('A'
) 与 66 ('B'
) 异或的结果。
关于Ruby 按位异或 2 相同长度的 ascii 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22414411/