将整数转换为十六进制,结果始终为2个字节

时间:2012-05-04 20:45:44

标签: python usb

我想将使用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])

有什么想法吗?我可以捏造它并以邋way的方式做,但我希望有一个合适的方法来做到这一点。谢谢。

更新

 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建议的方法不起作用,因为生成的十六进制值在我的代码中是技术上的字符串?相反,我只是跳过我的整个循环转换为十六进制,并直接做了拉文和moooeeeep建议,它的工作!谢谢!

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

您使用的语法是否很好?即你使用'%02x'?我之前没有见过,想要更好地理解它。

3 个答案:

答案 0 :(得分:1)

  

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

你的意思是这样的:

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

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

答案 1 :(得分:1)

这是否符合要求?

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

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

的产率:

010405FF12

使用列表理解和连接操作。

或者,正如@moooeeeep所建议的那样是使用生成器的解决方案:

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

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

答案 2 :(得分:0)

另一种方法

>>> data_read = [0x01, 0x2b, 0x22, 0x10]
>>> ("{:02x}"*len(data_read)).format(*data_read)
'012b2210'