Python 中的字节数组只接受无符号整数
Byte array in Python only accepts unsigned integers
我正在 Python 中使用字节数组编辑音频文件中的单个字节数据的音频编解码器。
我想到了某种加密方法,要求我对存储在字节数组中的单个字节执行按位运算。
其中一个操作是 ~
运算符(按位非),它基本上反转位(b'0001
变为 b'1110
)。
问题是当您引用字节数组的单个元素时,它 returns 是一个 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 之间的无符号整数。如何将有符号整数转换为无符号整数,以便用于表示两个值的位保持不变?
干杯
使用不同的位翻转操作。
例如:1
array[i] = 255 - array[i]
或者还有:
array[i] = 255 ^ array[i]
将翻转 所有(即:8)位。
1 这背后的数学原理可以从 two's complement 维基百科页面计算出来。
稍微使用一下二进制计算器后,解决方案实际上非常简单。
只需从 256 中减去 SIGNED int 的大小,即可得到具有相同二进制表示的 UNSIGNED int 的值。
所以,
-23
已签名将是 233
未签名。
希望这对寻找解决方案的其他人有所帮助:)
编辑:对于那些说答案是 255 - array[0]
的人。在这种情况下,我正在寻找一种从 post NOT'd int 到其未签名计数器部分的方法。所以我已经对整数执行了按位非运算,现在我只是将它恢复为可以输入字节数组的形式。
所以最后它看起来像这样:
tmp = ~array[0]
array[0] = 256 + tmp
或
array[0] = 256 - abs(tmp)
这让我得到了正确答案:)
我正在 Python 中使用字节数组编辑音频文件中的单个字节数据的音频编解码器。
我想到了某种加密方法,要求我对存储在字节数组中的单个字节执行按位运算。
其中一个操作是 ~
运算符(按位非),它基本上反转位(b'0001
变为 b'1110
)。
问题是当您引用字节数组的单个元素时,它 returns 是一个 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 之间的无符号整数。如何将有符号整数转换为无符号整数,以便用于表示两个值的位保持不变?
干杯
使用不同的位翻转操作。
例如:1
array[i] = 255 - array[i]
或者还有:
array[i] = 255 ^ array[i]
将翻转 所有(即:8)位。
1 这背后的数学原理可以从 two's complement 维基百科页面计算出来。
稍微使用一下二进制计算器后,解决方案实际上非常简单。
只需从 256 中减去 SIGNED int 的大小,即可得到具有相同二进制表示的 UNSIGNED int 的值。
所以,
-23
已签名将是 233
未签名。
希望这对寻找解决方案的其他人有所帮助:)
编辑:对于那些说答案是 255 - array[0]
的人。在这种情况下,我正在寻找一种从 post NOT'd int 到其未签名计数器部分的方法。所以我已经对整数执行了按位非运算,现在我只是将它恢复为可以输入字节数组的形式。
所以最后它看起来像这样:
tmp = ~array[0]
array[0] = 256 + tmp
或
array[0] = 256 - abs(tmp)
这让我得到了正确答案:)