在Python中将整数转换为2字节十六进制值

11

为了使用tkinter GUI,我必须以'0x00'格式读取十六进制地址以设置I2C地址。目前我采用的方法是将输入读取为字符串,将字符串转换为整数,然后将该整数转换为实际的十六进制值,如下面的部分代码所示:

GUI初始化:

self.I2CAddress=StringVar()
self.I2CAddress.set("0x00") #Sets Default value of '0x00'
Label(frame, text="Address: ").grid(row=5, column=4)
Entry(frame, textvariable=self.I2CAddress).grid(row=5, column=5)

然后在函数内部:

addr = self.I2CAddress.get()   
addrint = int(addr, 16)  
addrhex = hex(addrint)

这适用于大部分数值,但我的问题在于,如果我输入一个小的十六进制值字符串,比如 '0x01',它会转换为正确的整数 1,但接下来它会被转换为十六进制值 0x1 而不是 0x01。

我是一名电气工程师,对编程经验非常有限,所以非常感谢任何帮助。

1个回答

18

使用 format() 函数:

format(addrint, '#04x')

这将输入值格式化为一个带前导零的两位十六进制字符串,#包括“标准前缀”,在本例中是0x。请注意,宽度为4包括该前缀。 x生成小写十六进制字符串;如果需要大写,请使用X

演示:

>>> for i in range(8, 12):
...     print format(i, '#04x')
... 
0x08
0x09
0x0a
0x0b

你回答得太快了,我必须等几分钟才能回复,但我一定会的。 - BDP
@abarnert: 啊,不,字段宽度包括前缀。 - Martijn Pieters
对不起,你需要{:#04x}。每当我用C或Python编写代码时,我会毫不犹豫地输入10、6或4,但每当我向别人解释时,我会告诉他们使用8、4或2,他们也会遇到与你一样的问题。你会认为我会在这些十年中学到点什么…… - abarnert
1
使用#前缀,您可以直接使用format()函数,完全不需要使用字符串模板。 - Martijn Pieters
@MartijnPieters,对于format(-1,'04X'),输出结果是-01而不是FF。 - Nazar
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接