[英]Bitwise operator to calculate checksum
我试图提出一个C / C ++函数来计算给定十六进制值数组的校验和。
char * hex =“ 3133455D332015550F23315D”;
例如,上面的缓冲区有12个字节,然后最后一个字节是校验和。
现在需要做的是,将1st 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)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.