在Python中减去8位整数

3 投票
1 回答
4740 浏览
提问于 2025-04-18 01:06

我正在尝试用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位可以在最后一次性处理,而不是每次计算都处理。

撰写回答