Как суммировать значения в последовательности байтов в C - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь выяснить, как добавить последовательные байты в блоке данных, начиная с заданного смещения (sequenceOffset) к sequenceLength, введя их в 16-разрядные целые числа со знаком (int16_t). Числа могут быть отрицательными и положительными. Мне кажется, что я не увеличиваю смещение должным образом, но не могу понять, как это должно быть сделано.

Например:

Последовательность суммирования 8 байты со смещением 53:

57 AB 2A 2 C 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;
    }

1 Ответ

0 голосов
/ 01 апреля 2020

Есть некоторые серьезные проблемы с вашим кодом.

Начните с того, что вы заметили, что ваш код вообще не использует sequenceLength - это странно.

Тогда нет необходимости oop по всему блоку - вам нужно только посмотреть на байты внутри соответствующей последовательности.

Эта строка очень странная:

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

Она сравнивает значение данных внутри данных блок с sequenceOffset - это не кажется правильным.

И эта часть:

(int16_t*)(&sequenceOffset);

на самом деле является нарушением строгого правила псевдонимов.

Наконец, вы никогда не упоминайте, с каким порядком данных хранятся данные. Из вашего примера он выглядит как little-endian, поэтому я буду использовать little-endian в приведенном ниже коде:

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;
}
...