如何优雅实现十六进制字节数组元素异或校验并生成新数组
Python中优雅实现bytearray异或校验和并追加到原数组
我正尝试对bytearray中的所有元素进行异或运算,生成十六进制格式的校验和值,最终将结果追加到原数组形成新的bytearray。抱歉,我现在对Python有些生疏了。以下是我的实现代码:
XorMath = bytearray([0x50,0x021,0x45,0x53]) Xor1 = bytearray[0] ^ bytearray[1] Xor2 = Xor1 ^ bytearray[2] Xor3 = Xor2 ^ bytearray[3] checksum = hex(Xor3) new_array = XorMath.append(checksum) print(new_array)请问有没有更优雅的实现方式?
先修正你原代码里的几个问题:
- 十六进制写法错误:
0x021应改为0x21,0x前缀后直接跟有效十六进制数字即可 - 数组元素引用错误:要使用定义的变量名
XorMath[0],而非bytearray[0] append方法是原地修改原数组,不会返回新数组,且不能直接追加十六进制字符串,需传入字节对应的整数值
下面是两种更优雅的实现方式:
方式一:循环累加异或
XorMath = bytearray([0x50, 0x21, 0x45, 0x53]) checksum = 0 for b in XorMath: checksum ^= b # 直接将校验和整数追加到数组 XorMath.append(checksum) print(XorMath)
方式二:用reduce简化代码
借助functools.reduce可以把序列元素依次传入异或操作,代码更简洁:
from functools import reduce import operator XorMath = bytearray([0x50, 0x21, 0x45, 0x53]) checksum = reduce(operator.xor, XorMath) XorMath.append(checksum) print(XorMath)
补充说明
- 异或校验和的初始值设为0即可,因为0和任何值异或结果都是该值本身,符合依次异或的逻辑
- 如果需要将校验和转为十六进制字符串查看,计算后执行
hex(checksum)即可,但追加到bytearray时无需转字符串,直接用整数就行 bytearray.append()接受0-255范围内的整数,会自动转换为对应的字节存储
内容的提问来源于stack exchange,提问作者Artificial_Spark
相关产品推荐
相关产品推荐

