2015-05-12 8 views
1

Введи раздел реестра HKEY_LOCAL_MACHINE\SOFTWARE\test\test_qword Тип REG_QWORD и значение 20150509091344 (0x1253a7efba10).Как я могу прочитать reg_qword в winreg в python 3.4?

Затем я попытался загрузить его с помощью 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?

+0

я понял, что нужно преобразовать информацию следующим образом: 'код теста = анс [-2]: для i в диапазоне (int (len (ans)/2)): \t test + = ans [- (i * 2 + 2) :-(i * 2)] print (int (test, 16)) 'но может быть, есть более простой способ? – prom1se

ответ

1

Код, который вы написали, интерпретирует значение как целое число, хранящее большой конец. Однако REG_QWORD is stored as a little-endian number.

Существует гораздо более простой способ преобразования значения bytes в 64-разрядное целое число: с использованием struct.unpack(). Формат '<q' прочтет подписанное 64-битное мало-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(), находятся в the docs for the struct module.

+0

Большое спасибо за помощь! – prom1se