鉴于输入是十六进制字符串或bytearray
,我需要将其转换为整数。
当然,一种方法是检查类型,例如:
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)
或者:
def func(x):
return int('0x'+''.join(['{:02x}'.format(i) for i in bytearray(x)]),16)
但是对于第一个选项,我得到TypeError: string argument without an encoding
。
对于第二个选项,我得到ValueError: invalid literal for int() with base 16
。
有什么想法可以解决此问题,或者以其他方式解决原始问题吗?
谢谢!
答案 0 :(得分:1)
“整洁”并不总是更好。当您可以直接将字节数组转换为整数时,将字节数组转换为字符串然后再将字符串转换为整数是很浪费的。
例如
def func(x):
if isinstance(x, str):
return int(x, base=16)
else:
assert isinstance(x, (bytearray, bytes))
return int.from_bytes(x, byteorder='big')
assert func(bytearray(b'\xff\x00')) == func('0xff00') == 0xff00
答案 1 :(得分:0)
您可以使用字节数组的hex方法将字节数组转换为可以解析的字符串:
def func(x):
if hasattr(x, 'hex')
x = x.hex()
return int(x,16)
例如:
>>> func('0xffff')
65535
>>> func(bytearray([0xff, 0xff]))
65535