在python中处理二进制文件字符串时,“^”运算符的等效值是什么?

2024-09-29 23:30:37 发布

您现在位置:Python中文网/ 问答频道 /正文

如何应用代表两个字符bin的二进制字符串的异或?在

这是一个代码

def Xor(a,b):

    ABytes = a.encode('ascii','strict')
    BBytes = b.encode('ascii','strict')

    ABinaries = bin(int(binascii.hexlify(ABytes),16))
    BBinaries = bin(int(binascii.hexlify(BBytes),16))

    #this is what i want to do:
    xor = ABinaries ^ BBinaries 

    return xor

但是由于^运算符不在字符串上操作。代码不工作,问题是我需要返回异或的二进制值。在

如果成功了,我怎么能得到xor的字符串值呢?在


Tags: 字符串代码binascii二进制encodeintstrict
3条回答

当您在python3中索引或迭代bytes时,您可以得到int值,xor

>>> a, b = b'abc', b'def'
>>> c = bytes(x^y for x,y in zip(a, b))
>>> c
b'\x05\x07\x05'
>>> bytes(x^y for x,y in zip(a, c))
b'def'
>>> bytes(x^y for x,y in zip(b, c))
b'abc'

如果出于某种原因我想把它作为一个位字符串(表示法?我当然不会用它来计算),我会使用内置格式,并将每个位串置零到8位:

^{pr2}$

这个对你有用吗?在

>>> bytes(a ^ b for a, b in zip(b'qwertyuiop', b'1234567890'))
b'@EVFAOBQV@'

应用中:

^{pr2}$

进一步应用如何使用:

>>> import random
>>> def crypt(data, password):
    random.seed(password)
    return xor(data, bytes(random.randrange(256) for i in range(len(data))))

>>> crypt(b'This is a test string to be encrypted.', 'Gr8+ 9a$$')
b'\x98ZE\xf2\x11\xe3=\x8b{\xf1Q"A\xd2\x8e\xb6.\xb2\xea\x81\x1b/\x8c\x15dFvHZ\xd9\x0cv8\xcd\xbe\x95\x1b\xc0'
>>> crypt(_, 'Gr8+ 9a$$')
b'This is a test string to be encrypted.'

我认为有些代码可以在您的函数中工作:

from itertools import zip_longest

reversed_bits = [str(int(x != y)) for x, y in zip_longest(ABinaries[:1:-1]),
                                                          BBinaries[:1:-1]),
                                                          "0")]
xor = "0b" + "".join(reversed(reversed_bits))

然而,这将是相当缓慢的。一种更快的方法是尽可能多地处理字节和整数,并完全避免二进制字符串。在

相关问题 更多 >

    热门问题