在Python中将十六进制字符串转换为数字列表的更简单/更好的方法?

时间:2015-05-06 16:35:27

标签: python hex

我的目标是从用户那里获得一个64个字符长的十六进制数(代表一个序列号)并转换为c_type 32bytes数。 序列号定义如下:

_sn =  c_ubyte * 32

我接受来自用户的SN字符串到args.sn变量。这就是我如何设法解决它。我确信有一种更简单,更优雅的方式,非常感谢您的帮助。

SN_List= []
for i in range(0,len(args.sn),2):
    myByte = args.sn[i: i+2]
    num = int("0x" + myByte,16)
    SN_List.append(num)

if(len(SN_List) != 32):
    print("S/N is not valid, it should be 64 hex characters long")
    return 1
_sn = (c_ubyte * 32)(*SN_List)

3 个答案:

答案 0 :(得分:3)

使用binascii(Python 3)非常简单:

import binascii

print(list(binascii.unhexlify(args.sn)))

示例:

>>> list(binascii.unhexlify('09F911029D74E35BD84156C5635688C0'))
[9, 249, 17, 2, 157, 116, 227, 91, 216, 65, 86, 197, 99, 86, 136, 192]

在Python 2中,您将使用

print map(ord, args.sn.decode('hex'))

示例:

>>> sn = '09F911029D74E35BD84156C5635688C0'
>>> print map(ord, sn.decode('hex'))
[9, 249, 17, 2, 157, 116, 227, 91, 216, 65, 86, 197, 99, 86, 136, 192]

答案 1 :(得分:1)

扩展@nneonneo的评论(binascii.unhexlifybinascii.a2b_hex相同):

_sn = (c_ubyte * 32)(*binascii.unhexlify("ffaabb"))

示例(使用十六进制ffaabb):

>>> binascii.unhexlify("ffaabb")
b'\xff\xaa\xbb'
>>> _sn = (c_ubyte * 32)(*binascii.unhexlify("ffaabb"))
>>> _sn
<__main__.c_ubyte_Array_32 object at 0x7fe14fee8bf8>
>>> for i in _sn:
...     print(i)
... 
255
170
187
0
0
<27 more zeros>

答案 2 :(得分:0)

首先,您可以使用列表推导来消除大部分开销代码。其次,只要您指定了第二个参数,就不必在转换为int时将0x添加到字符串中。第三,如果您需要验证字符串以确保它包含正确的位数,那么这应该是一个单独的步骤。或者,当出现问题时,你可以依靠一个凸起的异常。

SN_List = [int(args.sn[i: i+2], 16) for i in range(0, 64, 2)]