簡體   English   中英

python2和python3之間的XOR function有什么區別?

[英]What is a difference in XOR function between python2 and python3?

我有兩個字符串:

string1 = "\xc5\x06\x92\xd0\x02k=\x91"
string2 = "qwert\00\00\00"

和 function:

def xor(str1,str2):
    ret = ''
    for i in range(8):
        ret += chr(ord(str1[i]) ^ ord(str2[i]))
    return ret

上述function的結果是:

在 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 替換字符來顯示它(output 中的ef bf bd序列是它無法識別的字符成為替換的地方字符;您用來轉換為字節的任何內容都用其 UTF-8 編碼無縫替換了 Unicode 替換字符)。

當區域設置正確並且您具有處理結果的終端/字體支持時,它在Python 2Python 3上的工作方式相同。 The only real difference is that Python 3 has somewhat saner behaviors under some locales (eg Windows console using UTF-8 automatically in 3.6, legacy C locale coercion in 3.7), but you got the same string, it's just outputting and displaying it that produces the wrong結果,同時試圖避免不可編碼的字符。

需要明確的是,Python 2 str不限於 ASCII。 就它所能容納的內容而言,相當於 Python 3 bytes 兩者都可以保存 [0, 256) 范圍內的任意值。 文字不同(Py2 允許文字中的非 ASCII 字符沒有轉義,但沒有文件編碼聲明,它不可移植),但 Py2 str可以像 Py3 bytes 's b'\xff'一樣保存'\xff' \xff' 。

請注意,當str包含未使用轉義插入的 ASCII 范圍之外的字符時,您的代碼通常不會以相同的方式工作(它取決於文件的編碼聲明,字符串文字中的非 ASCII 文字字符對 Python 2 的含義) ),並且對於不在 latin-1 中的東西肯定不會起作用(因為它在 Py3 中的序數大於 256,誰知道在 Py2 中是什么),除非輸入是unicode類型的 Python 2 (例如文字,以u為前綴)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM