如何在 C 中对字节序列中的值求和

How to sum values in a sequence of bytes in C

我想弄清楚如何将数据块中从给定偏移量 (sequenceOffset) 开始的顺序字节添加到 sequenceLength,方法是将它们打字为带符号的 16 位整数 (int16_t)。数字可以是正数也可以是负数。我觉得我没有正确增加偏移量,但无法弄清楚它是如何完成的。

例如:

偏移量 53 处的 8 个字节的求和序列:

57AB 2A 2C 4E A4 7A 64

-21673 11306 -23474 25722

你说的总和是:22848

应该是:-8119

int16_t sumSequence16(const uint8_t* const blockAddress, uint32_t blockLength, uint32_t sequenceOffset,
    uint8_t sequenceLength) {

        int count = 0;
        for (int i = 0; i < blockLength; i++) {
            if (*(blockAddress + i) == sequenceOffset) {
                    count += (int16_t*)(&sequenceOffset);
                    sequenceOffset++;
            }
        }
    return count;
    }

您的代码存在一些严重问题。

首先注意到您的代码根本没有使用 sequenceLength - 这很奇怪。

那么就不需要遍历整个块——你只需要查看相关序列中的字节即可。

这一行很奇怪:

if (*(blockAddress + i) == sequenceOffset)
    ^^^^^^^^^^^^^^^^^^^
    Reads the data at index i

它将数据块内的数据值与 sequenceOffset 进行比较 - 这似乎不正确。

这部分:

(int16_t*)(&sequenceOffset);

实际上违反了严格的别名规则。

最后,你从来没有提到数据存储的字节顺序。从你的例子来看,它似乎是小端,所以我将在下面的代码中使用小端:

int16_t sumSequence16(const uint8_t* const blockAddress, 
                      const uint32_t sequenceOffset, 
                      const uint8_t sequenceLength) 
{
    uint8_t* p = blockAddress + sequenceOffset;  // Point to first byte in sequence
    int sum = 0;
    for (uint8_t i = 0; i < sequenceLength; i += 2)
    {
        int16_t t = 0;
        t = p[i+1];     // Read MSB
        t = t << 8;     // Shift MSB 8 bits to the left
        t = t | p[i];   // Add LSB
        sum = sum + t;  // Update the running sum
    }
    return sum;
}