我的目标是从用户那里获得一个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)
答案 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.unhexlify
与binascii.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)]