""十六进制字符串转换中的字

时间:2017-05-09 10:44:45

标签: python

为什么"?"字符出现在以下十六进制值? (我使用的是Python 3.5.1)

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

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

我得到的hexpairs的价值是:

b'?\x8c\xcc\xcd'

?字符有什么意义?我原以为输出是:

b'\x3f\x8c\xcc\xcd'

3 个答案:

答案 0 :(得分:2)

@Benedict回答是正确的,以下是一些可以帮助您理解的资料来源:

  

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

对于?字符:

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

如您所见,您可以在0b之前使用0o0xint之类的前缀,以使python了解您不使用十进制数字。

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

答案 1 :(得分:1)

?由于unhexlify使用3F作为字节代码,这是“?”的ASCII代码。因此,Python将这些字节显示为ASCII码。

答案 2 :(得分:-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ú