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