我正在研究Python(yikes)中的音频编解码器,使用字节数组编辑音频文件中的单个字节数据。
我有一定的加密要求我对存储在字节数组中的单个字节执行逐位操作。
其中一个操作是~
运算符(按位NOT),它基本上反转了该位(b'0001
变为b'1110
)。
问题是当你引用一个字节数组的单个元素时,它返回一个int(默认情况下Python是否考虑无类型的8位数据整数?)。默认情况下,Python中的整数是有符号的(我不认为Python中存在无符号整数)。
当您尝试在字节数组中的某个字节上执行逐位NOT时,会出现以下错误:
>>> array[0] = ~array[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: byte must be in range(0, 256)
这是因为它期望0到255之间的unsigned int。如何将signed int转换为unsigned int,以便用于表示两个值的位保持不变?
干杯
答案 0 :(得分:1)
使用不同的操作进行位翻转。
E.g: 1
array[i] = 255 - array[i]
或者:
array[i] = 255 ^ array[i]
将翻转所有(即:8)位。
1 这背后的数学可以从two's complement维基百科页面得出。
答案 1 :(得分:-1)
在使用二进制计算器后,解决方案实际上非常简单。
从256减去SIGNED int的大小,得到具有相同二进制表示的UNSIGNED int的值。
所以,
签名的{p>-23
将233
无签名。
希望这有助于其他寻求解决方案的人:)
编辑:对于那些说答案是255 - array[0]
的人。在这种情况下,我正在寻找一种从post NOT'd int到其未签名计数器部分的方法。所以我已经在整数上执行了按位NOT,现在我只是将它恢复为可以输入到字节数组的形式。
所以最后它看起来像这样:
tmp = ~array[0]
array[0] = 256 + tmp
或
array[0] = 256 - abs(tmp)
这给了我正确答案:)