在R2000 RFID读取器模块的配置中,我在上一次中有所进步。现在我有一个新问题。如果我想获得天线设置信息,我会发送一个十六进制命令,模块会返回下一个信息:A5 5A 00 0A 2b22 1112 0D 0A其中数据22 11是DByte1 DByte0并且意味着天线1、5、10和14被选择。我不知道如何从22 11十六进制代码中获得这些信息。
DByte1(Hex 22(表示选择天线10和14DByte0(Hex 11(表示天线1和5被选择为
如何在Ruby中从Hex 11获得10,14值,从Hex 22获得1,5值?如果我用Hex 20设置了天线14,我该如何做相反的操作?
提前感谢
这是一个简单的二进制格式。0x2211
是一个16位整数,其中每个位代表一个天线:
format('%016b', 0x2211)
#=> "0010001000010001"
# ^ ^ ^ ^
# 14 10 5 1
因此,要想弄清楚是否设置了天线,只需检查相应的位是否设置为1
:
n = 0x2211
n[0] == 1 #=> true
n[1] == 1 #=> false
n[2] == 1 #=> false
n[3] == 1 #=> false
n[4] == 1 #=> true
注意,索引是基于0的,即n[0]
是天线1。
如何在Ruby中从Hex 11获得10,14值,从Hex 22获得1,5值?
您可以提取二进制digits
,将each
数字与其基于1的索引(with_index
(组合,select
那些设置为1
的位,并通过map
:提取它们的索引
0x2211.digits(2) #=> [1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1]
.each.with_index(1) #=> [[1, 1], [0, 2], [0, 3], [0, 4], [1, 5], [0, 6], [0, 7], [0, 8], [0, 9], [1, 10], [0, 11], [0, 12], [0, 13], [1, 14]]
.select { |b, i| b == 1 } #=> [[1, 1], [1, 5], [1, 10], [1, 14]]
.map(&:last) #=> [1, 5, 10, 14]
或使用位运算符&
和<<
:
antennas = []
0.upto(15) { |i| antennas.push(i + 1) if (0x2211 & (1 << i)) != 0 }
antennas #=> [1, 5, 10, 14]