【问题标题】:_winreg.QueryValueEx returns "mixed typed" binary value_winreg.QueryValueEx 返回“混合类型”二进制值
【发布时间】:2017-02-20 16:47:04
【问题描述】:

在 Python 3.4 下,我使用 winreg.QueryValueEx() 从注册表中获取键值,以便将其与文本文件进行比较。 我遇到了REG_BINARY 键值为bytes 但其中有unicode 值的问题:

  • 预期的注册表项值 - 52 50 43 46 01 1b 00 00 00 ff fe ff 04 46 00 6c 00 61...
  • 返回的键值 - b'RPCF\x01\x1b\x00\x00\x00\xff\xfe\xff \x04F\x00l\x00a\x00t\x00\x00\n \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 分离 strbytes 甚至 Python 3 中 winreg 中的错误有关。

非常感谢任何帮助和提示,以便将其统一为单一类型。 谢谢!

【问题讨论】:

  • 您为什么认为粗体值有问题?你想对失败的返回值做什么?您可以学习 How to Ask a good question 并创建一个 Minimal, Complete, and Verifiable 示例。这让我们更容易为您提供帮助。
  • 例如,我希望这些值是 \x52\x50\x43\x46 而不是 RPCF - 所有字节格式相同。添加了我使用返回值的信息。
  • 这些值实际上是相同的。您只是看到了 python 如何显示字符串与字节的工件。

标签: python python-3.x registry winreg


【解决方案1】:

看起来您在注册表中的数据甚至不是 unicode。 您甚至需要将其解码为 un​​icode 吗?

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

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

【讨论】:

  • 谢谢尼尔!我只是将读取的字节数组与从参考中读取的字节数组进行了比较,不需要解码\编码! :)
猜你喜欢
  • 1970-01-01
  • 2016-09-21
  • 2015-06-01
  • 1970-01-01
  • 2020-07-13
  • 2020-07-20
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多