Python 将十六进制字符串或字节数组转换为整数
给定一个十六进制字符串或字节数组的输入,我需要将其转换为整数 当然,一种方法是检查类型,例如:Python 将十六进制字符串或字节数组转换为整数,python,arrays,string,python-3.x,Python,Arrays,String,Python 3.x,给定一个十六进制字符串或字节数组的输入,我需要将其转换为整数 当然,一种方法是检查类型,例如: a = '0xb8c2659029395bdf' b = bytearray([0xb8,0xc2,0x65,0x90,0x29,0x39,0x5b,0xdf]) def func(x): if type(x) == str: return int(x,16) else: return int('0x'+''.join(['{:02x}'.format
a = '0xb8c2659029395bdf'
b = bytearray([0xb8,0xc2,0x65,0x90,0x29,0x39,0x5b,0xdf])
def func(x):
if type(x) == str:
return int(x,16)
else:
return int('0x'+''.join(['{:02x}'.format(i) for i in x]),16)
print(func(a))
print(func(b))
def func(x):
return int(str(x),16)
>>> func('0xffff')
65535
>>> func(bytearray([0xff, 0xff]))
65535
但我正在寻找一种“更整洁”的方式
我想到的一个想法是首先将输入转换为其中一种类型
例如:
a = '0xb8c2659029395bdf'
b = bytearray([0xb8,0xc2,0x65,0x90,0x29,0x39,0x5b,0xdf])
def func(x):
if type(x) == str:
return int(x,16)
else:
return int('0x'+''.join(['{:02x}'.format(i) for i in x]),16)
print(func(a))
print(func(b))
def func(x):
return int(str(x),16)
>>> func('0xffff')
65535
>>> func(bytearray([0xff, 0xff]))
65535
或:
但是对于第一个选项,我得到的是TypeError:string参数没有编码
对于第二个选项,我得到ValueError:invalid literal for int(),基数为16
您知道如何解决此问题,或者以不同的方式解决原始问题吗?您可以使用bytearray的方法将bytearray转换为可以解析的字符串:
def func(x):
if hasattr(x, 'hex')
x = x.hex()
return int(x,16)
例如:
a = '0xb8c2659029395bdf'
b = bytearray([0xb8,0xc2,0x65,0x90,0x29,0x39,0x5b,0xdf])
def func(x):
if type(x) == str:
return int(x,16)
else:
return int('0x'+''.join(['{:02x}'.format(i) for i in x]),16)
print(func(a))
print(func(b))
def func(x):
return int(str(x),16)
>>> func('0xffff')
65535
>>> func(bytearray([0xff, 0xff]))
65535
“整洁”并不总是更好。当您可以直接将bytearray转换为整数时,将bytearray转换为字符串然后将字符串转换为整数是一种浪费
例如
bytearray.fromhex(“xxxxxx”)
?好吧,你使用了if
那么这比我的方法有什么好处呢?我同意,但性能不是我的问题,所以我宁愿在编码方面更整洁。你希望实现什么?代码应该是简单的、有文档记录的、简洁的,并且按顺序排列。性能是一个独立的考虑因素,优先于所有三个因素,但仅当性能至关重要时。我给出我的答案是因为它比bytearray转换更简单,而不是因为它性能好。我不这样写这个函数的唯一原因是如果我在做一个代码挑战。