2017-02-20 54 views
1

在Python 3.4下,我使用winreg.QueryValueEx()从注册表中获取键值,以便将其与文本文件进行比较。 我遇到一个问题,即在REG_BINARY键值为bytes,但它也有Unicode值:_winreg.QueryValueEx返回“混合型”二进制值

  • 预期的注册表项值 - 52 50 43 46 01 1B 00 00 00 FF FF FE 04 46 00 00 6C 61 ...
  • 返回键值 - b” RPCF \ X01 \ X1B \ X00 \ X00 \ X00 \ XFF \ XFE \ XFF \ x04F \ x00l \ X00A \ x00t \ X00 \ X00 \ n \ X00 \ x8b ...'(加粗了一些有问题的值)
  • 尝试了一些decode \ encode选项,由于混合类型而全部失败(例如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分开strbytes甚至Python 3中的winreg中的一个错误。

希望得到任何帮助和提示,以便将它统一为单一类型。 谢谢!

+0

为什么你认为粗体值有问题?你想用失败的返回值做什么?你可以学习[如何提出一个好问题](http://stackoverflow.com/help/how-to-ask)并创建一个[Minimal,Complete,and Verifiable](http://stackoverflow.com/help/) mcve)的例子。这使我们更容易帮助你。 –

+0

我预计这些值是\ x52 \ x50 \ x43 \ x46而不是RPCF,例如 - 所有字节格式相同。 增加了我使用返回值的信息。 –

+1

这些值实际上是相同的。你只是看到python如何显示字符串与字节的工件。 –

回答

0

看起来你的数据在注册表中甚至没有unicode。 你甚至需要将它解码为unicode吗?

为什么不将数据存储在二进制文件中?

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

谢谢尼尔!我只是将读取的字节数组与从参考中读取的字节数组进行比较,并且不需要decode \ encode! :) –