问题描述
我想通过 Python 更改注册表项值。值类型将为 REG_DWORD
,表示十六进制,包括整数格式的 0x000
。我无法将带有数字的字符串转换为其十六进制格式的整数。
for i in range(len(checking_names)): #loop through names to check
if checking_names(i) !== should_values(i): #no match
with winreg.CreateKeyEx(key,subkey_path,winreg.KEY_ALL_ACCESS) as subkey:
winreg.DeleteValue(subkey,names_data[i]) #have to delete name in order to overwrite
winreg.SetValueEx(subkey,names_data[i],winreg.REG_DWORD,new_hex_value) #overwrite name value with correct value from predefined list
我的 values_data
列表由作为字符串的预定义变量组成。其中一个条目是字符串 '9600'
。在我上面的代码中,values_data[i]
应该是十六进制格式的 9600:0x00002580
。对于此转换,我执行以下操作:
dec_to_hex_str = format(int(values_data[i]),'x') #string decimal to string hexadecimal conversion
zeros_pre_x = '0x' #0x for format 0xffffffff
zeros_to_add = 8 - len(dec_to_hex_str) #count number of leading 0s to add
mid_zeros_list = []
for j in range(zeros_to_add):
mid_zeros_list.append(0) #add a leading 0
mid_zeros = ''.join(mid_zeros_list) #convert list to string
new_hex_value = int(zeros_pre_hex + mid_zeros + dec_to_hex_str)
当我运行此代码时,我的 Python shell 没有响应,并且 subkey
值的 Windows 注册表中没有任何更改。问题似乎是,winreg.SetValueEx .... winreg.REG_DWORD
只理解整数格式,但我的 new_hex_value
没有正确地从字符串转换为整数。
任何帮助将不胜感激!
解决方法
你的问题出在线路上
new_hex_value = int(zeros_pre_hex + mid_zeros + dec_to_hex_str)
您正在将数字转换为十六进制字符串,然后将其转换为整数。这不仅是 int()
的无效参数,而且即使它是正确的,您也只是将其转换回整数(Python 中没有十六进制整数这样的东西)。所以你的行应该是:
new_hex_value = zeros_pre_hex + mid_zeros + dec_to_hex_str
然后简单地把它写成一个 REG_SZ
因为你想要一个十六进制字符串,而不是一个整数。注册表中也没有“十六进制整数”。