微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python2和python3之间的XOR函数有什么区别?

如何解决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 2Python 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' 一样保存 bytesb'\xff'

请注意,当 str 包含未使用转义插入的 ASCII 范围之外的字符时,您的代码通常不会以相同的方式工作(这取决于文件的编码声明) Python 2 的字符串字面意思),并且对于不在 latin-1 中的东西绝对不会起作用(因为它在 Py3 中的序数将大于 256,而谁知道 Py2 中是什么),除非输入是 { {1}} 在 Python 2 中输入(例如,对于文字,以 unicode 为前缀)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。