我有下一个代码:
string_msg = '\x80\x01\x00\x00\x00\x00\x53\x58\x00\x1C\x00\x00\x00\x08\x00\x01\x00\x74\x00\x00\x00\x0A\x00\x54\x00\x00\x00\x03'
print(string_msg)
if sys.version < '3':
print(":".join("{:02x}".format(ord(c)) for c in string_msg))
else:
print(":".join("{:02x}".format(c) for c in string_msg.encode()))
在python 2中,结果是:
80:01:00:00:00:00:53:58:00:1c:00:00:00:08:00:01:00:74:00:00:00:0a:00:54:00:00:00:03
但是在python 3中,结果是:
c2:80:01:00:00:00:00:53:58:00:1c:00:00:00:08:00:01:00:74:00:00:00:0a:00:54:00:00:00:03
现在我需要在python 3中执行这段代码,所以我必须删除开头的第一个字节才能删除“c2”,一切都会好的,但试着用太多代码片来做我在这个论坛中找到了:
string_msg = string_msg[1:]
string_msg.replace('\xC2', '')
string_msg = ''.join([i if ord(i) < 130 else '' for i in string_msg])
结果总是一样的:
01:00:00:00:00:53:58:00:1c:00:00:00:08:00:01:00:74:00:00:00:0a:00:54:00:00:00:03
还删除了第二个字节80
,所以我的问题是:如何删除第一个字节c2
以及为什么当我尝试这样做时第二个字节也被删除了?
答案 0 :(得分:2)
问题是string_msg
是Python 2上的字节字符串,尽管看起来相同,它是Python 3上的Unicode字符串 - 字节b'\x80'
是一个与Unicode代码点完全不同的概念{ {1}}:可以使用不同编码中的不同字节表示相同的Unicode代码点,反之亦然,相同的字节可能代表不同编码中的不同字符。
如果u'\x80'
是一个字节序列,则使用string_msg
字面值:
b''
答案 1 :(得分:0)
您可以通过编码为ISO 8859-1将前256个字符中的文本转换为其天真字节值。
3>> '\x80'.encode('latin-1')
b'\x80'