0

我正在尝试从连接到串行端口的 RFID 阅读器获取数据。数据以混乱的字符形式出现,我必须将其转换为十六进制。当我这样做时,尝试将其转换为十六进制时出现错误:

puts "%02X" % key

我收到此错误:'%':Integer() 的无效值:“\xE2\x10......”等

它几乎可以正确转换它,因为 "\xE2\x10..." 等接近它应该输出的内容,它应该是 00 00 E2 00 10... 等等。我不确定是否有另一种方法要将其转换为十六进制,我也尝试过:

key.to_i.to_s(16)

key.hex

但是两者都产生 0 作为输出,这是不正确的。当我尝试将其转换为整数时,它会将其转换为 0,我不知道为什么。

如果有帮助,这是完整的代码,其中大部分来自网络上的示例:

require "serialport"
class RfidReader
 attr_accessor :key

 def initialize(port)
   port_str = "COM7"
   baud_rate = 9600
   data_bits = 8
   stop_bits = 1
   parity = SerialPort::NONE
   @sp = SerialPort.new(port_str, baud_rate, data_bits, stop_bits, parity)
   @key_parts = []
   @key_limit = 16 # number of slots in the RFID card.
   while true do
     main
   end
   @sp.close
 end

 def key_detected?
   @key_parts << @sp.getc
   if @key_parts.size >= @key_limit
     self.key = @key_parts.join()
     @key_parts = []
     true
   else
     false
   end
 end

 def main
   if key_detected?

    self.key.gsub!(/\0/, '')
    #puts self.key.hex
    #puts self.key.to_i.to_s(16)
    puts "%02X" % key
    #puts key



   end
 end
end

RfidReader.new("COM7")
4

1 回答 1

1

你得到的是一个包含来自 RFID 阅读器的字节流的字符串。使用1将字节字符串转换为实际字节(数字)。String#unpack

random_bytes_from_reader = "\xE2\x10\x42\x23\xA9"
random_bytes_from_reader.unpack('C*') # assume we have unsigned chars
#=> [226, 16, 66, 35, 169]

您已经知道如何将它们显示为十六进制字符串number.to_s(16)

1阅读文档!的参数unpack取决于您的 RFID 阅读器的规格。'C*'只是我的一个猜测。

于 2013-09-17T06:01:14.853 回答