我如何在 python 3.4 的 winreg 中读取 reg_qword?

How can I read a reg_qword in winreg in python 3.4?

我插入了一个注册表项,HKEY_LOCAL_MACHINE\SOFTWARE\test\test_qword,类型为 REG_QWORD,值为 20150509091344 (0x1253a7efba10)。

然后我尝试使用 winreg 和 Python 3.4 中的以下代码加载它:

import winreg
key_dir = r"SOFTWARE\test"
reg = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key_dir, 0,
                     winreg.KEY_WOW64_64KEY+winreg.KEY_ALL_ACCESS)
test_dir = list(winreg.QueryValueEx(reg, r'test_qword'))[0]
print(test_dir)
ans = "".join(map(lambda b: format(b, "02x"), test_dir))
print(ans)
print(int(ans, 16))

并得到以下控制台输出:

b'\x10\xba\xef\xa7S\x12\x00\x00'
10baefa753120000
1205539352207294464

这不是我的原始值。如何使用 winreg 检索我的原始值?

您编写的代码将该值解释为大端存储的整数。然而,REG_QWORD is stored as a little-endian number.

有一种更简单的方法来转换 64 位整数的 bytes 值:使用 struct.unpack()。格式 '<q' 将读取带符号的 64 位小端整数:

>>> struct.unpack('<q', b'\x10\xba\xef\xa7S\x12\x00\x00')
(20150509091344,)

如果您想以大端方式阅读它:

>>> struct.unpack('>q', b'\x10\xba\xef\xa7S\x12\x00\x00')
(1205539352207294464,)

您可以看到它给您的值与您在代码中得到的值相同。

有关 struct.unpack() 及其反转 struct.pack() 格式代码的更多信息,请参见 the docs for the struct module.