Ruby中的DWord操作

时间:2011-10-06 09:33:20

标签: ruby bit-manipulation

我正在寻找使用Ruby在DWord中转换字节值数组的方法。

例如: [255,1,255,2] - > 11111111 00000001 11111111 000000010

然后我需要一种方法来处理来自此DWord的任何字节(或Word)并执行按位操作。

有人可以建议一种方法,将4字节数组转换为DWord,然后在生成的DWord中访问字节吗?

3 个答案:

答案 0 :(得分:0)

你可以使用

  
    

“101” .to_i(2)     => 5

  

  
    

5.to_s(2)     => “101”

  

很容易转换为其他基础(基础是参数)

请参阅 http://www.ruby-doc.org/core/classes/String.html#M000802

对于您的号码的位操作,

请参阅 http://www.tutorialspoint.com/ruby/ruby_operators.htm

并查看 Ruby Bitwise Operators

一章

答案 1 :(得分:0)

首先将数组转换为一个很好的字符串,你可以这样做:

puts [255,1,255,2].map{|val| val.to_s(2).rjust(8, '0')}.join(' ')

对于二进制操作,它非常简单。它使用基于C的运算符:

OR => 1 | 2 = 3
AND => 1 & 2 = 0
XOR => 1 ^ 3 = 2 

您不应该为bitwise operations ...

使用字符串

答案 2 :(得分:0)

您可以将逻辑封装在类中。这是一个精简的示例(需要添加边界和错误检查)。

class Byte
  attr_accessor :value

  def initialize(integer)
    @value = integer
  end

  def to_s
    value.to_s(2).rjust(8,"0")
  end
end

class DWord
  attr_accessor :bytes

  def initialize(*byte_list)
    @bytes = []
    byte_list.each do |b|
      @bytes << Byte.new(b)
    end
  end

  def to_s
    @bytes.map(&:to_s).join(' ')
  end
end

你可以为Word,QWord等做类似的事情。上面的内容将允许你这样做:

dword = DWord.new(255,1,255,2)

puts dword

# 11111111 00000001 11111111 00000010

dword.bytes.each do |b|
  puts "#{b.value} = #{b}"
end

# 255 = 11111111
# 1 = 00000001
# 255 = 11111111
# 2 = 00000010