如何在 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;
}
我想弄清楚如何将数据块中从给定偏移量 (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;
}