2017-10-18 171 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