在Python中将字符串转换为带有“0x”和前导0的十六进制

问题描述

我想通过 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 因为你想要一个十六进制字符串,而不是一个整数。注册表中也没有“十六进制整数”。