在Python中减去8位整数

时间:2014-04-03 02:50:46

标签: python integer bit-manipulation 8-bit

我尝试使用Python通过重复减去一系列8位值来计算校验和。但是,我不知道如何在Python中执行此操作。< / p>


在上下文中: 我有以下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;

它是checksum code for GBA game headers。我在Python中复制它时遇到了麻烦。我可以做除sum = sum - *header++;以外的所有事情,因为(据我所知),Python对变量的大小没有限制。我已经使用Python int尝试过此操作,但这会产生错误的校验和。从我所看到的8位限制是做一些我不了解或不了解的特殊事情。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

要在Python中进行8位运算,只需执行常规整数运算并去掉结果的最后8位。

count = (0xbc - 0xa0) & 0xff

这适用于无符号值。如果您需要签名结果,请检查它是否大于127,如果是,则减去256.

count = count - 256 if count > 127 else count

这整个功能相当不是Pythonic。我将其翻译如下:

def fix_header(header):
    sum = 0
    for b in header[0xa0:0xbc]:
        sum -= ord(b)
    sum = (sum - 0x19) & 0xff
    return sum

我在此假设header是一个字节串,因此ord是将字节转换为整数所必需的。我还认为将结果转换为8位可以在结束时进行一次而不是每次计算。