【问题标题】:Subtracting 8-bit integers in Python在 Python 中减去 8 位整数
【发布时间】:2014-04-03 02:50:46
【问题描述】:

我正在尝试使用 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 integer bit-manipulation 8-bit


    【解决方案1】:

    要在 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 位可以在最后完成一次,而不是每次计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-10
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      相关资源
      最近更新 更多