如何应用表示两个字符的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
但是由于^
运算符不对字符串进行操作。 代码不起作用,问题是我需要返回异或的二进制值。
如果它有效,我如何获取异或的字符串值?
当你在 Python 3 中索引或迭代bytes
时,你会得到int
个可以xor
的值:
>>> a, b = b'abc', b'def'
>>> c = bytes(x^y for x,y in zip(a, b))
>>> c
b'x05x07x05'
>>> 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 位:
>>> ''.join(format(x, '08b') for x in c)
'000001010000011100000101'
这对你有用吗?
>>> bytes(a ^ b for a, b in zip(b'qwertyuiop', b'1234567890'))
b'@EVFAOBQV@'
在应用中:
>>> def xor(x, y):
assert isinstance(x, bytes) and isinstance(y, bytes), 'Pass in bytes!'
assert len(x) == len(y), 'Bytes must be of same length!'
return bytes(a ^ b for a, b in zip(x, y))
>>> xor(b'zxcvbnm,./', b'asdfghjkl;')
b'x1bx0bx07x10x05x06x07GBx14'
如何使用它的进一步应用:
>>> 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'x98ZExf2x11xe3=x8b{xf1Q"Axd2x8exb6.xb2xeax81x1b/x8cx15dFvHZxd9x0cv8xcdxbex95x1bxc0'
>>> 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))
但是,这将相当缓慢。一种更快的方法是尽可能多地处理字节和整数,并完全避免二进制字符串。
ABytes = a.encode('ascii','strict')
BBytes = b.encode('ascii','strict')
ABinaries =""
BBinaries = ""
AtempBinaries = bin(int(binascii.hexlify(ABytes),16))
BtempBinaries = bin(int(binascii.hexlify(BBytes),16))
if len(AtempBinaries)<10:
ABinaries= '0b'+(((9-len(AtempBinaries))*'0') +AtempBinaries.split('0b')[1])
if len(BtempBinaries)<10:
BBinaries = '0b'+ (((9-len(BtempBinaries))*'0') +BtempBinaries.split('0b')[1])
i = 0
xor = ""
for element in ABinaries:
if (i == 0):
xor = xor + '0'
elif (element == 'b'):
xor = xor + 'b'
else:
xor = xor + str(int(element)^int(BBinaries[i]))
i = i + 1
return (xor)
这似乎解决了问题,没有直接的方法对两个二进制文件串进行异或。