Python字节数组元素为int时的按位NOT操作疑问
关于Python字节数组与位运算的疑问解答
嘿,这个问题我之前处理二进制数据时也纠结过,来给你讲明白~
首先直接回答你的核心疑问:是的,Python确实会把字节数组(或者bytes对象)里的单个无符号8位数据以整数形式返回。在Python的设计里,字节本身就是用0-255范围内的整数来表示的——这样做其实更方便我们进行位运算、数值计算这类操作,比单独搞一个“字节类型”要灵活得多。
接下来解决你提到的按位取反(~)操作的问题:直接用~处理字节对应的整数时,你会发现结果是负数,比如~1会得到-2。这是因为Python的整数是任意精度的,按位取反会翻转所有二进制位(包括高位),而不是只翻转低8位。要得到我们需要的“8位无符号字节取反”结果,只需要把取反后的数值和0xFF做按位与操作,就能保留低8位的正确值:
举个贴合你音频编解码场景的代码例子:
# 假设这是你的音频字节数组 audio_data = bytearray(b'\x01\x05\x0a') # 取第一个字节(返回int类型,值为1) original_byte = audio_data[0] # 执行按位取反并保留8位无符号结果 inverted_byte = ~original_byte & 0xFF # 把处理后的字节存回数组 audio_data[0] = inverted_byte print(audio_data) # 输出: bytearray(b'\xfe\x05\n'),原0x01变成了0xfe(254)
这样处理后,你就能得到正确的8位比特翻转结果,完全符合你加密逻辑的需求。而且当你把0-255范围内的整数赋值回字节数组时,Python会自动把它转换成对应的无符号8位字节,不需要额外的类型转换。
内容的提问来源于stack exchange,提问作者jmkmay
相关产品推荐
相关产品推荐

