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

标签 c++ c

我正在尝试提出一个 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/

相关文章:

c++ - 通过 Rust 中的泛型类型进行编译时算术,类似于 C++?

c++ - Wireshark 没有检测到任何发送的数据包。发送返回0

c - 为什么我没有得到连接的字符串?

c - C 中的 typedef for struct

c - 如何查找目录的链接数

c - 如何使用插入排序正确对数组进行排序?

c++ - 当自定义库名称与系统库名称相同时,CMake出现循环依赖错误

c++ - Qt C++ : How to change layout after new project opening?

c++ - 2个类似typedef定义的差异

c++ - 找出采样器何时在 DirectShow 中准备就绪