将十六进制字符串或字节数组转换为整数

时间:2018-11-08 10:24:17

标签: python arrays string python-3.x

鉴于输入是十六进制字符串或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

有什么想法可以解决此问题,或者以其他方式解决原始问题吗?

谢谢!

2 个答案:

答案 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