sorbet - 1 month ago 5x

Python Question

I'm trying to use Python to calculate a checksum by repeatedly **subtracting a series of 8 bit values.** However, I don't know how to do this in Python.

I have the following C code I'm trying to convert to 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;

It's the checksum code for GBA game headers. I'm having trouble replicating this in Python. I can do everything except

`sum = sum - *header++;`

`int`

Your help is appreciated!

Answer

To do 8-bit arithmetic in Python, simply do regular integer arithmetic and strip off the last 8 bits of the result.

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

This works for unsigned values. If you need a signed result, check to see if it's greater than 127 and subtract 256 if it is.

```
count = count - 256 if count > 127 else count
```

This whole function is rather un-Pythonic though. I'd translate it as follows:

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

I make the assumption here that `header`

is a bytestring and thus `ord`

is necessary to turn the bytes into integers. I also think that converting the result to 8 bit can be done once at the end instead of at every calculation.

Source (Stackoverflow)

Comments