Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将十六进制字符串或字节数组转换为整数_Python_Arrays_String_Python 3.x - Fatal编程技术网

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转换更简单,而不是因为它性能好。我不这样写这个函数的唯一原因是如果我在做一个代码挑战。