为什么“?”字符出现在以下十六进制值中? (我正在使用Python 3.5.1)“?”十六进制字符串转换中的字符
我的目标是将string
转换为十六进制值对。
string = b'3f8ccccd'
hexpairs = binascii.unhexlify(string)
为hexpairs
我得到的价值是这样的:
b'?\x8c\xcc\xcd'
什么?
字符的意义是什么?我本来期望的输出是:
b'\x3f\x8c\xcc\xcd'
为什么“?”字符出现在以下十六进制值中? (我正在使用Python 3.5.1)“?”十六进制字符串转换中的字符
我的目标是将string
转换为十六进制值对。
string = b'3f8ccccd'
hexpairs = binascii.unhexlify(string)
为hexpairs
我得到的价值是这样的:
b'?\x8c\xcc\xcd'
什么?
字符的意义是什么?我本来期望的输出是:
b'\x3f\x8c\xcc\xcd'
The?由于unhexlify已将3F用作字节码(这是“?”的ASCII码),因此发生。因此,Python将这些字节显示为ASCII码。
@Benedict回答的是正确的,下面是一些资源来帮助您了解:
最初基于英语字母表,如由ASCII图表上方 ASCII编码128个指定 字符为七个位整数。[8]编码的字符是数字0到9,小写字母 a到z,大写字母A到Z,基本标点符号,控制 源自电传打字机的代码和空格。例如,对于 示例,小写字母j将变成二进制1101010和十进制106. ASCII包括128个字符的定义:33个非打印 控制字符(许多已过时)[9]影响文本和 空间的处理方式[10]和95个可打印的字符,包括 空间
对于?
字符:
chr(0b00111111)
将输出?
chr(0o77)
将输出?
chr(63)
将输出?
chr(0x3f)
将输出?
正如你所看到的,你可以使用前缀像0b
,0o
,或0x
int
之前使Python明白你不是用十进制数工作。
但是0x8C
不在ascii表中(因为它从0到127)。 0x8C
是十进制数140,它不能显示等值。
这个问题可以通过下面给出的方式来解决。
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ú
其值对应于字符的ASCII被显示为这些字符的字节数。而0x3F是“?”的ASCII码 –
就是这样!谢谢。 – Hefaestion
@Hefaestion如果你想输出写为你期望的字符串:'“”.join(“\\ x {}”。format(char.decode())for char in(string [i:i + 2] for我在范围内(0,len(string),2)))。encode()' – Paradoxis