检验和(checksum),在数据处理和数据通信领域中,用于校验目的地一组数据项的和。通常用在通信中,尤其是远距离通信中保证数据的完整性和准确性。 现在请你实现如下校验算法。传送的数据为一个字符串,该字符串只包含数字。校验规则为先求和,然后用和除以97得到的余数即为校验和。求和的规则是数字本身乘以该数字的位置(从左向右数)。如字符串123456789,则求和过程如下: 1X1 + 2X2 + 3X3 + 4X4 + 5X5 + 6X6 + 7X7 + 8X8 + 9X9 = 285。除以97后得余数为91,即为校验和。用c語言表述
时间: 2023-02-22 12:36:50 浏览: 70
下面是用C语言实现上述校验算法的代码示例:
```
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int checksum(char *str) {
int len = strlen(str);
int sum = 0;
for (int i = 0; i < len; i++) {
sum += (str[i] - '0') * (i + 1);
}
return sum % 97;
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: %s <string>\n", argv[0]);
return 1;
}
printf("Checksum: %d\n", checksum(argv[1]));
return 0;
}
```
相关问题
一个const char * const data 和一个unsigned short checkSum如何把两个数据连接在一起
如果您想把一个 `const char * const data` 和一个 `unsigned short checkSum` 连接在一起,您可以使用一个新的缓冲区来存储连接后的数据。以下是一个示例代码:
```c++
const char * const data = "Hello, world!";
unsigned short checkSum = 12345;
// 计算数据长度和校验和
size_t dataLength = strlen(data);
unsigned short calculatedCheckSum = calculateCheckSum(data, dataLength);
// 创建新的缓冲区来存储连接后的数据
size_t bufferSize = dataLength + sizeof(checkSum);
char * buffer = new char[bufferSize];
// 将数据和校验和复制到新的缓冲区中
memcpy(buffer, data, dataLength);
memcpy(buffer + dataLength, &checkSum, sizeof(checkSum));
// 现在 buffer 指向的就是连接后的数据,可以进行后续操作了
// 使用完后不要忘记释放内存
delete[] buffer;
```
在上述代码中,我们首先计算了原始数据的长度和校验和。然后创建了一个新的缓冲区来存储连接后的数据。使用 `memcpy` 函数将原始数据和校验和复制到新的缓冲区中,即可完成数据连接。最后,使用完后不要忘记释放新的缓冲区的内存。
注意:在使用 `memcpy` 函数时,请确保目标缓冲区有足够的空间来存储所有的数据。
如何从一个单txd引脚的单数据总线的传感器中,用UART通信协议读取有两个帧头和一个校验和的数据
假设单txd引脚的单数据总线传感器发送的数据格式如下:
| 帧头1 | 帧头2 | 数据1 | 数据2 | ... | 数据n | 校验和 |
|-------|-------|-------|-------|-----|-------|--------|
| 0xAA | 0x55 | ... | ... | ... | ... | ... |
其中,帧头1和帧头2均为1个字节,数据1到数据n的长度不定,校验和为1个字节。下面是一个从该传感器读取数据并用UART通信协议发送的示例代码:
```c
// 定义串口通信对象
SoftwareSerial mySerial(2, 3); // RX, TX
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
}
void loop() {
if (mySerial.available()) { // 从传感器接收数据
uint8_t buffer[256];
int len = 0;
// 等待帧头1
while (mySerial.read() != 0xAA) {
// do nothing
}
// 等待帧头2
while (mySerial.read() != 0x55) {
// do nothing
}
// 读取数据
while (mySerial.available() && len < 256) {
buffer[len++] = mySerial.read();
}
// 读取校验和
uint8_t checksum = mySerial.read();
// 校验数据
uint8_t sum = 0;
for (int i = 0; i < len; i++) {
sum += buffer[i];
}
if (checksum != sum) {
Serial.println("Checksum error!");
return;
}
// 输出数据
Serial.print("Data: ");
for (int i = 0; i < len; i++) {
Serial.print(buffer[i], HEX);
Serial.print(" ");
}
Serial.println();
}
}
```
在上面的代码中,我们使用了一个软件串口对象mySerial来接收传感器发送的数据。当mySerial.available()返回true时,表示有数据可读。我们首先等待帧头1和帧头2,然后读取数据和校验和,并进行校验。如果校验和不正确,则说明数据出错;否则,我们输出数据到串口监视器中。注意,这里我们假设传感器发送的数据长度不超过256个字节,因此我们定义了一个256字节的缓冲区。如果实际情况下数据长度可能超过256个字节,则需要相应地增加缓冲区的大小。
相关推荐
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)