我正在尝试从连接到串行端口的 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")