Как я могу прочитать reg_qword в winreg в 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?

1 ответ

Решение

Код, который вы написали, интерпретирует значение как целочисленное значение с прямым порядком байтов. Тем не мение, REG_QWORD хранится как порядковый номер

Есть гораздо более простой способ конвертировать bytes значение 64-разрядного целого числа: использование struct.unpack(), Формат'<q'будет читать 64-битное целое число с прямым порядком байтов со знаком:

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

И если вы хотите прочитать это как big-endian:

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

Вы можете видеть, что это дает вам то же неверное значение, которое вы получили в своем коде.

Подробнее о кодах формата дляstruct.unpack()и его обратное,struct.pack()в документах дляstruct модуль.

Другие вопросы по тегам