2017-10-18 170 views
0

我嘗試了下面的方法,但沒有運氣。無法在Python 3.6.3中將HEX轉換爲ASCII

方法1:

變種包含十六進制值

bytes.fromhex(var).decode('ascii') 
Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xdb in position 0: ordinal not in range(128) 

方法2:

codecs.decode(var,"hex") 

這是返回我在字節,而不是在ASCII。

有人可以幫助進行此轉換嗎?

+0

在對其中一個答案的評論中,粘貼了'var'的實際值。這個十六進制字符串不能被ASCII編碼,因爲它包含超出ASCII範圍的十六進制值。錯誤消息是有效的。 – ElmoVanKielmo

+0

但python 2.7.3我能夠用這種方法(var.decode(「hex」)) – CoolNetworking

+0

與python 2.7.3進行轉換,這是結果>>> var = var.decode('hex') >>> type(var) 我無法粘貼var output,因爲它太長,但它的工作原理。 – CoolNetworking

回答

1

你嘗試:

chr(var) 

這應該給你一個ASCII碼字符。

+0

var如何包含十六進制值?這是我的十六進制value.'DB91132598CCBF76AE668B4B085176BB192775221FDBB50FCE1C3927C077EAF1E3DAC4C8A8E8028C3F7295EF8157CED597A36EF1C3BFA451477BFF32EEB1806C2CC0442585197A2BCD2C4392147AADB93066D0BA5AB6DBFD3F6FCEB7073AE61A5D4AA8ABCBCFF4EEBD1A1655689BFD7EAB82D77BF7224F75FBCD323C9B9FA9C0B7D799180878A81D5D07CF05BE39EEF989B2FC3077997D2C2F1162E5B47D99E4B415BC8CE5C755476931BD8ED14B5FCEC1C8C654515946AB7860BBBEE7DCCFDAA7AA410FF65352B153B58728D57814C610F825286D830C308429BDCF1167887B125EFB2FA34B3DEACD329F57674C071BEF6C9CEAC0C7FABB587A1D6F8B4D0B53' – CoolNetworking

+0

在這種情況下,VAR是用十六進制編碼值的字符串? 您可以嘗試使用int(var,16)獲取整數值,但您需要將var分成兩個字符的元組。 –

+0

這是變種中包含「DB91132598CCBF76AE668B4B085176BB192775221FDBB50FCE1C3 927C077EAF1E3DAC4C8A 8E8028C3F7295EF8157C ED597A36EF1C3BFA4514 77BFF32EEB1806C2CC04 42585197A2BCD2C43921 47AADB93066D0BA5AB6D BFD3F6FCEB7073AE61A5 D4AA8ABCBCFF4EEBD1A1 655689BFD7EAB82D77BF 7224F75FBCD323C9B9FA 9C0B7D799180878A81D5 D07CF05BE39EEF989B2F C3077997D2C2F1162E5B 47D99E4B415BC8CE5C75 5476931BD8ED14B5FCEC 1C8C654515946AB7860B BBEE7DCCFDAA7AA410FF 65352B153B58728D5781 4C610F825286D830C308 429BDCF1167887B125EF B2FA34B3DEACD329F576 74C071BEF6C9CEAC0C7F ABB587A1D6F8B4D0B53' – CoolNetworking

0
>>> var = int('7A', 16) #var is an integer now 
>>> chr(var) #int value to char 
'z' 

此解決方案僅適用於一個字符。您必須拆分字符串並將所有十六進制值分開轉換。看看here如何分割它。

+0

我的var包含一個十六進制值的字符串。 – CoolNetworking

+0

看看我的編輯 – raze92

+0

chr(0xf8)不是自0xf8 == 248以來的ASCII字符,而且它高於128.實際上,這個字符是:'import unicodedata' =>'print(unicodedata.name(chr(0xf8)) )'=>'拉丁文小寫字母O用筆畫' – MaximTitarenko

0

你試過

codecs.decode(codecs.decode(var,'hex'),'ascii') 
+0

是的,但它給了我下面的錯誤>>> codecs.decode(codecs.decode(var,'hex'),'ascii') 回溯(最近呼叫最後): 文件「」,第1行,在 UnicodeDecodeError:'ascii'編解碼器無法解碼位置0中的字節0xdb:序號不在範圍內(128) – CoolNetworking

+0

這並未提供問題的答案。一旦你有足夠的[聲譽](https://stackoverflow.com/help/whats-reputation),你將能夠[評論任何帖子](https:// stackoverflow。COM /幫助/權限/評論);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/ review/low-quality-posts/17662238) – lit

1

當它從使用Python 3倍的問題,我認爲如下。

您錯誤的原因是,您嘗試使用ASCII碼解碼字節'0xdb',其值高於127.
您只是不能這麼做 - 在ASCII編碼中沒有這樣的字節值。

的選項有:

1.忽略解碼錯誤:

>>> u = 'DB91132598CC' # unicode 
>>> b = codecs.decode(u,"hex") # bytes 
>>> b 
b'\xdb\x91\x13%\x98\xcc' 
>>> result = b.decode("ascii", errors="ignore") # unicode 
>>> result 
'\x13%' 

2.使用不同的編碼:

>>> result = b.decode("cp1252") # for example 
>>> result 
'Û‘\x13%˜Ì' 

如果你想在結果使用選項#1只ASCII字符。

0

以下代碼:

codecs.decode(var,"hex") 
在Python

2.7結果與str

'\xdb\x91\x13%\x98\xcc\xbfv\xaef\x8bK\x08Qv\xbb\x19\'u"\x1f\xdb\xb5\x0f\xce\x1c9\'\xc0w\xea\xf1\xe3\xda\xc4\xc8\xa8\xe8\x02\x8c?r\x95\xef\x81W\xce\xd5\x97\xa3n\xf1\xc3\xbf\xa4QG{\xff2\xee\xb1\x80l,\xc0D%\x85\x19z+\xcd,C\x92\x14z\xad\xb90f\xd0\xbaZ\xb6\xdb\xfd?o\xce\xb7\x07:\xe6\x1a]J\xa8\xab\xcb\xcf\xf4\xee\xbd\x1a\x16Uh\x9b\xfd~\xab\x82\xd7{\xf7"Ou\xfb\xcd2<\x9b\x9f\xa9\xc0\xb7\xd7\x99\x18\x08x\xa8\x1d]\x07\xcf\x05\xbe9\xee\xf9\x89\xb2\xfc0w\x99},/\x11b\xe5\xb4}\x99\xe4\xb4\x15\xbc\x8c\xe5\xc7UGi1\xbd\x8e\xd1K_\xce\xc1\xc8\xc6TQYF\xabx`\xbb\xbe\xe7\xdc\xcf\xda\xa7\xaaA\x0f\xf6SR\xb1S\xb5\x87(\xd5x\x14\xc6\x10\xf8%(m\x83\x0c0\x84)\xbd\xcf\x11g\x88{\x12^\xfb/\xa3K=\xea\xcd2\x9fWgL\x07\x1b\xefl\x9c\xea\xc0\xc7\xfa\xbbXz\x1do\x8bM\x0bS' 

和在Python 3.6 bytes

b'\xdb\x91\x13%\x98\xcc\xbfv\xaef\x8bK\x08Qv\xbb\x19\'u"\x1f\xdb\xb5\x0f\xce\x1c9\'\xc0w\xea\xf1\xe3\xda\xc4\xc8\xa8\xe8\x02\x8c?r\x95\xef\x81W\xce\xd5\x97\xa3n\xf1\xc3\xbf\xa4QG{\xff2\xee\xb1\x80l,\xc0D%\x85\x19z+\xcd,C\x92\x14z\xad\xb90f\xd0\xbaZ\xb6\xdb\xfd?o\xce\xb7\x07:\xe6\x1a]J\xa8\xab\xcb\xcf\xf4\xee\xbd\x1a\x16Uh\x9b\xfd~\xab\x82\xd7{\xf7"Ou\xfb\xcd2<\x9b\x9f\xa9\xc0\xb7\xd7\x99\x18\x08x\xa8\x1d]\x07\xcf\x05\xbe9\xee\xf9\x89\xb2\xfc0w\x99},/\x11b\xe5\xb4}\x99\xe4\xb4\x15\xbc\x8c\xe5\xc7UGi1\xbd\x8e\xd1K_\xce\xc1\xc8\xc6TQYF\xabx`\xbb\xbe\xe7\xdc\xcf\xda\xa7\xaaA\x0f\xf6SR\xb1S\xb5\x87(\xd5x\x14\xc6\x10\xf8%(m\x83\x0c0\x84)\xbd\xcf\x11g\x88{\x12^\xfb/\xa3K=\xea\xcd2\x9fWgL\x07\x1b\xefl\x9c\xea\xc0\xc7\xfa\xbbXz\x1do\x8bM\x0bS' 

的原因是,在Python 2.7

str == bytes #True 

而在Python 3.6

str == bytes #False 

Python 2的字符串是字節字符串,而Python 3字符串是Unicode字符串。兩個結果實際上是相同的,但Python 3中的字節字符串類型爲bytes而不是str,字面表示的前綴爲b
這與ASCII編碼無關,因爲沒有任何輸出變量(不管Python版本)是ASCII編碼的。
而且對Python 2.7版也將收到此錯誤:

codecs.decode(var, 'hex').decode('ascii') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xdb in position 0: ordinal not in range(128) 

我實際上是從粘貼的Python 2.7它解釋,但你可以檢查自己。
在任何版本的Python中,您的輸出字符串都不能用ascii解碼器解碼,因爲在任何情況下它都不是ascii編碼的字符串。

+0

感謝您的答覆。實際上,我希望在3.6版本中使用這種解碼方法(var.decode(「hex」)) 2.7並給了我預期的結果。 – CoolNetworking

+0

@CoolNetworking的結果是一樣的。字節字符串。只有符號不同,因爲Python 3的Unicode字符串爲'str'類型。 – ElmoVanKielmo