不要在Python3中自动将十六进制转换为十进制

2024-09-28 23:21:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我第一次注意到这种差异

Python3:

>>> a = b'\x80\xad\x16\xc4\xb7\x9a'
>>> a
b'\x80\xad\x16\xc4\xb7\x9a'
>>> a[0]
128

Python2:

>>> a = b'\x80\xad\x16\xc4\xb7\x9a'
>>> a
b'\x80\xad\x16\xc4\xb7\x9a'
>>> a[0]
'\x80'

首先,为什么会发生这种情况?第二件事是,我不希望python3将其转换为十进制,并且希望输出与python2相同,如何做到这一点

编辑:

我试图做的是将以太网地址作为字节数组传递,并以正确的符号显示它

python2中的代码:

def eth_addr(a):   # a = b'\x80\xad\x16\xc4\xb7\x9a'                                                                                                                                                   
  b = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x" % (ord(a[0]) , ord(a[1]) , ord(a[2]), ord(a[3]), ord(a[4]) , ord(a[5]))
  return b

当我在python3中运行它时,它(显然)给了我以下错误:

TypeError: ord() expected string of length 1, but int found                                                                                                                   

Tags: 编辑地址情况差异python3python2xc4ord
1条回答
网友
1楼 · 发布于 2024-09-28 23:21:23

这与十进制与十六进制无关,但在Python3中,单个字节表示为整数,在Python2中,非ascii字节表示为相同数字的十六进制值

您可以使用十六进制将小数转换为十六进制字符串:

>>> a = b'\x80\xad\x16\xc4\xb7\x9a'
>>> a
b'\x80\xad\x16\xc4\xb7\x9a'
>>> hex(a[0])
'0x80'

或者使用x格式化程序:

>>> f"{a[0]:#x}"
'0x80'
>>> "%#x" % (a[0],)
'0x80'
>>> "{:#x}".format(a[0])
'0x80'

(删除#以避免0x前缀)


但是,您不能更改int与byte的行为


编辑

在Python 3中,修改后的示例实际上更简单:

def eth_addr(a):
    return "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x" % (a[0], a[1], a[2], a[3], a[4], a[5])

甚至:

def eth_addr(a):
    return ":".join("%.2x" % (d,) for d in a)

相关问题 更多 >