在Python中减去8位整数
我正在尝试用Python计算一个校验和,方法是反复减去一系列8位的值。不过,我不知道在Python中该怎么做。
背景: 我有一段C语言的代码,想把它转换成Python:
#define uint8_t unsigned char
static uint8_t fix_header(uint8_t *header) {
uint8_t sum = 0;
uint8_t count = 0xbc - 0xa0;
/* complement check of 0xa0 - 0xbc */
header = header + 0xa0;
while (count-- > 0) {
sum = sum - *header++;
}
sum = (sum - 0x19);
return sum;
这是GBA游戏头文件的校验和代码。我在用Python重现这个代码时遇到了麻烦。我能做的事情都能做到,除了sum = sum - *header++;
这行,因为(据我所知)Python中的变量没有大小限制。我尝试过使用Python的int
,但这给出的校验和不正确。从我看到的情况来看,8位的限制在这里做了一些我不理解或不知道的特殊处理。
感谢你的帮助!
1 个回答
4
在Python中进行8位运算,其实就是用普通的整数运算,然后把结果的最后8位去掉。
count = (0xbc - 0xa0) & 0xff
这个方法适用于无符号值。如果你需要有符号的结果,可以检查一下结果是否大于127,如果是,就减去256。
count = count - 256 if count > 127 else count
不过,这整个函数写得有点不符合Python的风格。我会这样改写:
def fix_header(header):
sum = 0
for b in header[0xa0:0xbc]:
sum -= ord(b)
sum = (sum - 0x19) & 0xff
return sum
在这里我假设header
是一个字节串,所以需要用ord
把字节转换成整数。我还认为,把结果转换成8位可以在最后一次性处理,而不是每次计算都处理。