如何解决python2和python3之间的XOR函数有什么区别?
我有两个字符串:
string1 = "\xc5\x06\x92\xd0\x02k=\x91"
string2 = "qwert\00\00\00"
和功能:
def xor(str1,str2):
ret = ''
for i in range(8):
ret += chr(ord(str1[i]) ^ ord(str2[i]))
return ret
以上函数的结果是:
在python2.7中:´�q��vk=�
;十六进制:ef bf bd 71 ef bf bd ef bf bd 76 6b 3d ef bf bd
在 python3.6 ´q÷¢vk=‘
中;十六进制:b4 71 f7 a2 76 6b 3d 91
我想这与python2中str
类型仅限于ascii的事实有关,但是如何在两个版本中获得相同的值?
解决方法
两个版本中的值相同。您只是在不支持某些字符的区域设置上打印它,并且它使用 Unicode 替换字符来显示它(输出中的 ef bf bd
序列是它无法识别的字符的位置)替换字符;无论您用于转换为字节的任何内容,都使用其 UTF-8 编码无缝替换了 Unicode 替换字符)。
当区域设置正确并且您拥有处理结果的终端/字体支持时,它在 Python 2 和 Python 3 上的工作方式相同。唯一真正的区别是 Python 3 在某些语言环境下有一些更理智的行为(例如 3.6 中的 Windows console using UTF-8 automatically,3.7 中的 legacy C locale coercion),但是你得到了相同的字符串,它只是输出和显示它产生尝试避免无法编码的字符时出现错误结果。
需要明确的是,Python 2 str
不限于 ASCII。就它可以容纳的内容而言,它相当于 Python 3 bytes
;两者都可以包含 [0,256) 范围内的任意值。文字不同(Py2 允许文字中的非 ASCII 字符没有转义,尽管没有文件编码声明,它不可移植),但 Py2 str
可以像 Py3 '\xff'
一样保存 bytes
的b'\xff'
。
请注意,当 str
包含未使用转义插入的 ASCII 范围之外的字符时,您的代码通常不会以相同的方式工作(这取决于文件的编码声明) Python 2 的字符串字面意思),并且对于不在 latin-1 中的东西绝对不会起作用(因为它在 Py3 中的序数将大于 256,而谁知道 Py2 中是什么),除非输入是 { {1}} 在 Python 2 中输入(例如,对于文字,以 unicode
为前缀)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。