我正在尝试使用 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;
这是checksum code for GBA game headers .我无法在 Python 中复制它。除了 sum = sum - *header++;
,我什么都能做,因为(据我所知)Python 对变量的大小没有限制。我已经尝试使用 Python 的 int
但这给出了不正确的校验和。据我所知,8 位限制正在做一些我不理解或不知道的特殊事情。
感谢您的帮助!
最佳答案
要在 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 位可以在最后一次完成,而不是每次计算都完成。
关于python - 在 Python 中减去 8 位整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22826957/