0

我想将使用 pyusb 通过 USB 接收的整数值数组转换为十六进制值列表。我希望这些十六进制值总是有两个字节,即 0x##。但是,正常的 hex() 函数将返回 0x1,输入为 1。我希望它返回 0x01。

然后在获得十六进制值列表后,我想将它们附加在一起,同时丢弃“0x”部分。这是我目前拥有的,非常简单。

data_read = dev.read(0x82,64,0,1000)
hex_data = range(0,len(data_read))

for i in range(0,len(data_read)):
    hex_data[i] = hex(data_read[i])

有任何想法吗?我可以捏造它并以草率的方式来做,但我希望有一种适当的方法来做到这一点。谢谢你。

更新:

 data_read = dev.read(0x82,64)
 print data_read
 >>> array('B', [169, 86, 128, 1, 0, 128])
 for i in range(0,len(data_read)):
      hex_data[i] = hex(data_read[i])
 print hex_data
 >>> ['0xa9', '0x56', '0x80', '0x1', '0x0', '0x80']

Lavon 建议的方法不起作用,因为生成的十六进制值在我的代码中是技术上的字符串?相反,我只是跳过了整个 for 循环转换为十六进制,并直接按照 Lavon 和 moooeeeep 的建议进行了操作,并且成功了!谢谢!

hex_data = ('%02x' %i for i in data_read)
print ''.join(hex_data)
>>> a95680010080

有没有很好的语法参考?即你使用的'%02x'?我以前没见过,想更好地理解它。

4

3 回答 3

1

然后在获得十六进制值列表后,我想将它们附加在一起,同时丢弃“0x”部分。

你的意思是这样的:

In [8]: data_read = [0x01, 0x2b, 0x22, 0x10]

In [9]: ''.join(map(lambda v: '%02x' % v, data_read))
Out[9]: '012b2210'

?

于 2012-05-04T20:48:36.863 回答
1

这符合要求吗?

data = [0x1, 0x4, 0x5, 0xFF, 0x12]

new_data = ['%02X' %i for i in data]
print ''.join(new_data)

产量:

010405FF12

使用列表推导和连接操作。

或者,正如@moooeeeeep 所建议的,这里是使用生成器的解决方案:

new_data = ('%02X' %i for i in data)
print ''.join(new_data)

有关字符串格式选项,请参阅

于 2012-05-04T20:52:32.663 回答
0

只是另一种方法

>>> data_read = [0x01, 0x2b, 0x22, 0x10]
>>> ("{:02x}"*len(data_read)).format(*data_read)
'012b2210'
于 2012-05-04T21:06:26.857 回答