简短的背景故事:
我目前正在研究用Python编写的密钥序列号(KSN)转换器。它使用我编写的tkinter框架输入要转换的值。基本上,将一个序列号放在框中,按转换,输出KSN。超级简单,而且有效。但是,我最近收到的序列号正在变成字母数字,我的转换器不支持。
问题:
我需要能够将列表中的序列号(包括数字和字母数字),将字母数字值更改为十六进制,并能够将列表中的每个值计算为二进制值。但是在计算时,我收到
ValueError: invalid literal for int() with base 10: (hex value)
我已经尝试使用谷歌搜索解决方案,并且在堆栈溢出时检查了其他答案,但是它们似乎没有提供我正在寻找的解决方案。我试图制作一个函数来转换数据,我试图将进程分解为更多绘制的进程以查看断点,但是一切都归结为十六进制值,我认为这是一个字符串。我知道
bin()
可以计算类似0x123abc
的内容,但是显然不会使用'0x123abc'
这是问题所在。serial_box = ['201805138', '239487D9298', '201805138', '239487D9298']
stage = [hex(int(x, 16)) if x.isdigit() is False else x for x in serial_box]
stage2 = [bin(int(x.strip())) for x in stage]
print stage
print stage2
输出:
stage2 = [bin(int(x.strip())) for x in stage]
ValueError: invalid literal for int() with base 10: '0x239487d9298L'
第一级变量应以以下形式返回serial_box中的列表:
['201805138', '0x239487d9298L', '201805138', '0x239487d9298L']
stage2需要将列表值返回为:
['0b1100000001110100110101010010', '0b100011100101001000011111011001001010011000', '0b1100000001110100110101010010', '0b100011100101001000011111011001001010011000']
最佳答案
您不能在仅包含十六进制数字(0-9,a-f)和可选的int(..., 16)
前缀的字符串上使用0x
。您的输入字符串带有一个尾随L
(用于长整数)。
尾随的L
需要删除:
>>> int('0x239487d9298L', 16)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 16: '0x239487d9298L'
>>> int('0x239487d9298', 16)
2445052580504
如果您有时无法阻止输入包含尾随的
L
,请使用str.rstrip('L')
删除它们。就个人而言,我会将所有数据保留为整数,并且仅在出于显示目的需要时才将这些整数值格式化为字符串(二进制,十六进制或其他形式)。
这将混合使用base-10和base-16字符串生成一个整数值列表:
int_values = [int(v.rstrip('L'), 16 if v[:2] == '0x' else 10) for v in serial_box]