Как я могу прочитать 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
модуль.