1

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

4

1 回答 1

1

您编写的代码将该值解释为大端存储的整数。但是,REG_QWORD存储为 little-endian 数字。

有一种更简单的方法可以转换bytes64 位整数的值:使用struct.unpack(). 该格式'<q'将读取一个有符号的 64 位 little-endian 整数:

>>> 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()参见struct模块的文档。

于 2015-05-12T12:37:57.540 回答