2015-02-08 35 views
2

我無法弄清楚我在這裏出錯的地方。python從struct.unpack()的輸出解碼UTF-16

這是我試圖解碼的一段數據。

('2','\x00','2','\x00','5','\x00','0','\x00', 
'P','\x00','i','\x00','n','\x00','O','\x00','V','\x00', 
'E','\x00','m','\x00','p','\x00','t','\x00','y','\x00') 

下面是一段代碼:

s = bytes(struct.unpack('28c',fld_desc)).decode('utf-16') 

而不是獲取字符串'2250PinOVEmpty',我這...符號很奇怪的字符串:

⠧㈧Ⱐ❜砰〧Ⱐ✲✬‧屸〰✬‧㔧Ⱐ❜砰〧Ⱐ✰✬‧屸〰✬‧倧Ⱐ❜砰〧Ⱐ❩✬‧屸〰✬‧渧Ⱐ❜砰〧Ⱐ❏✬‧屸〰✬‧嘧Ⱐ❜砰〧Ⱐ❅✬‧屸〰✬‧洧Ⱐ❜砰〧Ⱐ❰✬‧屸〰✬‧琧Ⱐ❜砰〧Ⱐ❹✬‧屸〰✩ 

哪兒我去錯誤?

+0

使用Google翻譯翻譯那個奇怪的符號,看看你得到了什麼...... :) – 2015-02-08 08:43:55

回答

2

如果您fld_desc確實是簡單的字節串'2\x002\x005\x000\x00P\x00i\x00n\x00O\x00V\x00E\x00m\x00p\x00t\x00y\x00',這是蟒蛇2,您需要做的僅僅

>>> fld_desc.decode('UTF-16-LE') 
u'2250PinOVEmpty' 

你出錯的地方在於你需要而不是在這裏使用struct.unpack。如果你這樣做,那麼你必須要注意的是struct.unpack返回字符的元組:

>>> struct.unpack(fld_desc) 
('2', '\x00', '2', '\x00', '5', '\x00', '0', '\x00', 'P', '\x00', 'i', '\x00', 
'n', '\x00', 'O', '\x00', 'V', '\x00', 'E', '\x00', 'm', '\x00', 'p', '\x00', 
't', '\x00', 'y', '\x00') 

其送入bytes(這畢竟是同義詞str在Python 2),使得它成爲一個新的字符串

"('2', '\\x00', '2', '\\x00', '5', '\\x00', '0', '\\x00', 'P', '\\x00', 'i', '\\x00', 'n', '\\x00', 'O', '\\x00', 'V', '\\x00', 'E', '\\x00', 'm', '\\x00', 'p', '\\x00', 't', '\\x00', 'y', '\\x00')" 

哪個解碼看起來像大多的CJK字符字符串,象形

「✨✲堯へ✰㈧Ⱗ✠硜〰Ⱗ✠✵堯へ✰〧Ⱗ硜〰Ⱗ✠❐堯へ✰椧Ⱗ✠硜〰Ⱗ✠❮堯へ✰傖Ⱗ✠硜〰Ⱗ✠❖堯へ✰䔧Ⱗ✠硜〰Ⱗ✠❭堯へ✰瀧Ⱗ✠硜〰Ⱗ✠❴堯へ✰礧Ⱗ✠硜〰⤧ 「

在小端排序(UTF-16-LE)

,和

」 ⠧㈧Ⱐ❜砰〧Ⱐ✲✬‧屸〰✬‧㔧Ⱐ❜砰〧Ⱐ✰✬‧屸〰✬‧倧Ⱐ❜砰〧Ⱐ❩✬‧屸〰✬‧渧Ⱐ❜砰〧Ⱐ❏✬‧屸〰✬‧嘧Ⱐ❜砰〧Ⱐ❅✬‧屸〰✬‧洧Ⱐ❜砰〧Ⱐ❰✬‧屸屸琧Ⱐ❜〧Ⱐ❹✬‧屸屸〰✩「

大端(UTF-16-BE)中的210

+2

謝謝!你的問題對我出錯的地方是一個非常明確的解釋。雖然您沒有指定解決問題的代碼,但從您的答案中我可以快速地找到解決方案。我正在將你的標記作爲_THE_的答案。 – pepoluan 2015-02-08 08:56:05

+1

啊,但我做了,爲清晰起見進行了更新。 – 2015-02-08 08:58:23

+0

我認爲OP可能希望'struct.pack()'而不是... – Kevin 2015-02-08 16:18:48

3

加入這些字符,然後對其進行解碼:

>>> data = ('2','\x00','2','\x00','5','\x00','0','\x00', 
...   'P','\x00','i','\x00','n','\x00','O','\x00','V','\x00', 
...   'E','\x00','m','\x00','p','\x00','t','\x00','y','\x00') 
>>> ''.join(data).decode('utf-16') 
u'2250PinOVEmpty' 
+0

謝謝!這真的解決了我的問題。但即使@Antti沒有提供解決方案,他對我的問題「我哪裏出了問題」提供了非常好的回答和解釋。我仍然投你的答案,因爲它削減了追逐。 – pepoluan 2015-02-08 08:55:04