我正在寻找使用Ruby在DWord中转换字节值数组的方法。
例如: [255,1,255,2] - > 11111111 00000001 11111111 000000010
然后我需要一种方法来处理来自此DWord的任何字节(或Word)并执行按位操作。
有人可以建议一种方法,将4字节数组转换为DWord,然后在生成的DWord中访问字节吗?
答案 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