Python 2.7中实现C风格字节数组XOR异或操作求助
实现C风格字节数组的XOR异或操作(基于cycle()避免长度计算)
你已经用cycle()搞定了字符串的XOR异或,现在要处理C风格字节数组?没问题,咱们直接调整下函数就能适配~
先回顾下你原来的字符串异或函数:
from itertools import cycle, izip def xor(message, key): toret = '' for c, k in izip(message, cycle(key)): toret += chr(ord(c) ^ ord(k)) return toret print(xor("test", "234556346"))
对于C风格字节数组(在Python里对应bytes或bytearray类型,每个元素是0-255的字节数值),我们不需要ord()和chr()的转换,直接对字节数值做异或即可,同时返回字节类型的结果。修改后的函数如下:
from itertools import cycle, izip def xor_bytes(message_bytes, key_bytes): # 直接对字节数值异或,返回bytearray(也可转成bytes) return bytearray(c ^ k for c, k in izip(message_bytes, cycle(key_bytes))) # 测试示例:用字节串模拟C风格字节数组 result = xor_bytes(b'test', b'234556346') print(result) # 输出字节数组对象 # 若需转成不可变字节串,直接用bytes(result) print(bytes(result))
关键差异说明:
- 输入类型:
message_bytes和key_bytes需为bytes或bytearray类型(比如用b''创建字节串) - 异或逻辑:直接取字节的数值做
^运算,省去字符串的编码转换步骤 - 返回结果:用
bytearray生成可修改的字节数组,也能通过bytes()转成不可变字节串适配不同场景
如果你的输入是从C语言环境读取的unsigned char数组,在Python中通常会自动解析为bytes类型,直接传入这个函数就行——和字符串版本一样,cycle(key_bytes)会自动循环密钥,完全不用管两者的长度是否匹配。
内容的提问来源于stack exchange,提问作者CDoc
相关产品推荐
相关产品推荐

