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

标签 ruby bit-manipulation

我正在尝试在 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/

相关文章:

ruby - Rake 和当前目录

c - 切换数据类型 int 的第 100 位会产生意想不到的结果

c - 使用按位运算符的 Sizeof 函数

c++ - 如何使 operator[] 返回对 unsigned int 中各个位的引用?

c - C 中的按位连接

ruby - MongoDB 地理空间在 HTTP 请求之间加载更多

ruby - Redmine 安装 Apache2 Bundler PermissionError

mysql - 多个 Rails 应用程序读取另一个 Rails 应用程序的单个数据库/表

ruby-on-rails - 在 rails_admin 中获取登录用户关联记录

c - C语言中位反转(从MSB-> LSB到LSB-> MSB)的高效算法