gpt4 book ai didi

c++ - 按位运算符计算校验和

转载 作者:太空宇宙 更新时间:2023-11-04 02:25:45 25 4
gpt4 key购买 nike

我正在尝试提出一个 C/C++ 函数来计算给定的十六进制值数组的校验和。

字符 *hex = "3133455D332015550F23315D";

例如,上面的缓冲区有 12 个字节,最后一个字节是校验和。

现在需要做的是,将第一个11个单独的字节转换为十进制,然后求和。

即 31 = 49, 33 = 51,.....

所以 49 + 51 + .........

然后将这个十进制值转换成十六进制。然后取该十六进制值的 LSB 并将其转换为二进制。

现在取这个二进制值的 2 的补码并将其转换为十六进制。在此步骤中,十六进制值应等于第 12 个字节。

但是上面的缓冲区只是一个例子,所以它可能不正确。

所以这涉及多个步骤。

我正在寻找一种使用按位运算符执行此操作的简单方法。

我做了类似的事情,但它似乎占用了前 2 个字节并且没有给我正确的答案。

int checksum (char * buffer, int size){
int value = 0;
unsigned short tempChecksum = 0;
int checkSum = 0;

for (int index = 0; index < size - 1; index++) {
value = (buffer[index] << 8) | (buffer[index]);
tempChecksum += (unsigned short) (value & 0xFFFF);
}

checkSum = (~(tempChecksum & 0xFFFF) + 1) & 0xFFFF;
}

我无法让这个逻辑起作用。我没有足够的嵌入式编程来理解按位运算符。欢迎任何帮助。

回答

我通过以下更改得到了它。

for (int index = 0; index < size - 1; index++) {
value = buffer[index];
tempChecksum += (unsigned short) (value & 0xFFFF);
}
checkSum = (~(tempChecksum & 0xFF) + 1) & 0xFF;

最佳答案

使用加法来获得校验和至少很奇怪。常见的校验和使用按位异或或完整的 crc。但假设它确实是您所需要的,它可以通过 unsigned char 操作轻松完成:

#include <stdio.h>

char checksum(const char *hex, int n) {
unsigned char ck = 0;
for (int i=0; i<n; i+=1) {
unsigned val;
int cr = sscanf(hex + 2 * i, "%2x", &val); // convert 2 hexa chars to a byte value
if (cr == 1) ck += val;
}
return ck;
}
int main() {
char hex[] = "3133455D332015550F23315D";
char ck = checksum(hex, 11);

printf("%2x", (unsigned) (unsigned char) ck);
return 0;
}

由于操作是在 unsigned char 上进行的,因此超过字节值的所有内容都会被正确丢弃,您将获得您的值(在您的示例中为 26)。

关于c++ - 按位运算符计算校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51497346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com