2017-05-09 108 views
2

为什么“?”字符出现在以下十六进制值中? (我正在使用Python 3.5.1)“?”十六进制字符串转换中的字符

我的目标是将string转换为十六进制值对。

string = b'3f8ccccd' 
hexpairs = binascii.unhexlify(string) 

hexpairs我得到的价值是这样的:

b'?\x8c\xcc\xcd' 

什么?字符的意义是什么?我本来期望的输出是:

b'\x3f\x8c\xcc\xcd' 
+6

其值对应于字符的ASCII被显示为这些字符的字节数。而0x3F是“?”的ASCII码 –

+0

就是这样!谢谢。 – Hefaestion

+0

@Hefaestion如果你想输出写为你期望的字符串:'“”.join(“\\ x {}”。format(char.decode())for char in(string [i:i + 2] for我在范围内(0,len(string),2)))。encode()' – Paradoxis

回答

1

The?由于unhexlify已将3F用作字节码(这是“?”的ASCII码),因此发生。因此,Python将这些字节显示为ASCII码。

2

@Benedict回答的是正确的,下面是一些资源来帮助您了解:

最初基于英语字母表,如由ASCII图表上方 ASCII编码128个指定 字符为七个位整数。[8]编码的字符是数字0到9,小写字母 a到z,大写字母A到Z,基本标点符号,控制 源自电传打字机的代码和空格。例如,对于 示例,小写字母j将变成二进制1101010和十进制106. ASCII包括128个字符的定义:33个非打印 控制字符(许多已过时)[9]影响文本和 空间的处理方式[10]和95个可打印的字符,包括 空间

对于?字符:

  • 二进制:00111111.在Python,chr(0b00111111)将输出?
  • 八进制:77.在python chr(0o77)将输出?
  • 十进制:63.在python chr(63)将输出?
  • 十六进制:3F。在python chr(0x3f)将输出?

正如你所看到的,你可以使用前缀像0b0o,或0xint之前使Python明白你不是用十进制数工作。

但是0x8C不在ascii表中(因为它从0到127)。 0x8C是十进制数140,它不能显示等值。

-1

这个问题可以通过下面给出的方式来解决。

hexastring = r'\xc3\xb9asdfsadf\xc3\xa9 asdfsdfsdf \xc3\x80 sdfsdfsdfdsf \xc3\xba' 

hexaValueList = re.findall(r'((?:\\x[a-f\d]{2})+)',hexastring) 
for hexaValue in hexaValueList: 
    beforeReplace = hexaValue 
    xReplace = re.sub(r'\\x','',hexaValue) 
    hex2String = bytearray.fromhex(xReplace).decode() 
    hexastring = re.sub(re.escape(beforeReplace),hex2String,hexastring) 

print (hexastring) 

回答

ùasdfsadféasdfsdfsdfÀsdfsdfsdfdsfú

相关问题