2017-02-20 16 views
1

В Python 3.4 я использую winreg.QueryValueEx() для получения значений ключа из реестра, чтобы сравнить его с текстовыми файлами. я столкнулся с проблемой, где REG_BINARY значение ключа bytes, но в нем есть юникоды:_winreg.QueryValueEx возвращает двоичное значение смешанной типизации

  • Ожидаемое значение реестра ключ - 52 50 43 46 01 00 00 1b 00 и далее и далее Fe 04 46 00 6в 00 61 ...
  • Возвращается значение ключа - б»RPCF \ x01 \ X1B \ x00 \ x00 \ x00 \ XFF \ XFE \ XFF \ x04F \ x00l \ x00a \ x00t \ x00 \ x00 \ п \ x00 \ x8b ... '(выделены жирным шрифтом некоторые проблемные значения)
  • попробовал некоторые декодировать \ кодировать параметры, все из-за смешанного типа не удалось (например, key_val.decode('utf-8'){UnicodeDecodeError}'utf-8' codec can't decode byte 0xff in position 9: invalid start byte)

Я использую возвращаемое значение, которое представляет собой шестнадцатеричные значения, в текстовый файл, содержащий ожидаемые шестнадцатеричные значения. Эти смелые значения не ожидаются, так как они не в шестнадцатеричном формате, и я не знаю их заранее, чтобы сделать некоторые обходные пути, чтобы их обрабатывать.

В Python 2.7 не было никаких проблем. Я предполагаю, что это связано с Python 3, разделяющим str и или даже ошибкой в ​​winreg в Python 3.

Поблагодарите за помощь и подсказку, чтобы объединить ее в один тип. Спасибо!

+0

Почему вы считаете смелые значения проблематичными? Что вы пытаетесь сделать с возвращаемым значением, которое терпит неудачу? Вы можете узнать [Как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask) и создать [Минимальный, Полный и Подтверждаемый] (http://stackoverflow.com/help/ mcve). Это облегчает нам помощь. –

+0

Я ожидал, что эти значения будут \ x52 \ x50 \ x43 \ x46 вместо RPCF, например, - все байты в том же формате. добавлена ​​информация для моего использования возвращаемого значения. –

+1

Эти значения на самом деле одинаковы. Вы просто видите артефакт о том, как python отображает строки по сравнению с байтами. –

ответ

0

Похоже, что ваши данные в реестре даже не юникод. Вам даже нужно декодировать его в Юникоде?

Почему бы не сохранить данные в двоичном файле?

bytes_data = winreg.QueryValueEx(your_key) 
with open("filename.txt", "wb") as stream: 
    stream.write(bytes_data) 
+0

Спасибо, Нир! Я просто сравнил массив байтов чтения с тем, который был прочитан из справки, и не потребовалось никакого декодирования \ encode! :) –