2017-02-20 99 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! :) –