文章目录
- 一、奇偶校验
- 二、 校验和
- 三、 BCC(Block Check Character,块校验字符)校验
- 四、CRC(循环冗余校验)
- 五、海明码校验
- 六、MD5(消息摘要算法第五版)和 SHA(安全哈希算法)系列
一、奇偶校验
- 原理
- 它是依据数据里二进制位中“1”的数量的奇偶特性来进行校验的,包含奇校验与偶校验这两种方式。在奇校验里,要保证数据中“1”的个数是奇数;偶校验则要确保数据中“1”的个数是偶数。
- 优点
- 实现起来非常简单,对硬件要求不高,所以硬件成本低。而且计算过程很简便,计算开销极小,只需要进行一次异或运算就能确定数据的奇偶性。
- 缺点
- 它的检测能力有很大局限性,只能检测出奇数位的数据错误,当出现偶数位错误时就无法检测到。并且不能确定错误发生的具体位置,也没办法对错误进行纠正。
- 应用领域
- 在早期计算机内存以及一些对错误检测要求不高的简单数据传输场景中被使用。
- 网页工具
- 链接:https://www.23bei.com/tool/625.html
- 以下是奇偶校验的 C 代码示例:
// 奇校验
int oddParityCheck(unsigned char data) {int count = 0;for (int i = 0; i < 8; i++) {if (data & (1 << i)) {count++;}}return count % 2;
}// 偶校验
int evenParityCheck(unsigned char data) {int count = 0;for (int i = 0; i < 8; i++) {if (data & (1 << i)) {count++;}}return!(count % 2);
}
二、 校验和
-
原理
- 把数据的各个字节进行相加从而得出一个和值,之后通常会将这个和值截断成为固定的位数,以此作为校验的依据。
-
优点
- 计算方法简单直接,计算速度快,相应的计算开销也很小。在对数据准确性要求不是特别高、但需要快速进行简单校验的场景中很适用。
-
缺点
- 检测错误的能力比较弱,对于很多复杂的错误情况无法准确检测,并且和奇偶校验一样,不能纠正检测到的错误。
-
应用领域
- 常用于网络数据包校验以及一些简单的文件校验等场景,在这些场景中主要起到初步筛查数据完整性的作用。
-
网页工具
- 链接:https://www.metools.info/code/c128.html
-
以下是校验和的 C 代码示例:
unsigned short checksum(unsigned char *data, int len) {unsigned int sum = 0;for (int i = 0; i < len; i++) {sum += data[i];}return (sum & 0xFFFF) + (sum >> 16);
}
三、 BCC(Block Check Character,块校验字符)校验
- 原理
- BCC 校验通常是对一组数据块中的每个字节进行特定的运算(如异或运算等),得到一个校验字符。这个校验字符与数据块一起传输或存储,在接收端对数据块进行同样的运算,将得到的结果与接收到的校验字符进行比较,以判断数据是否在传输或存储过程中发生错误。
- 优点
- 计算相对简单,实现起来比较容易。对于一些特定的数据格式和传输场景,能够快速有效地进行错误检测。
- 可以针对不同的数据块大小进行灵活调整,适应多种应用场景。
- 缺点
- 错误检测能力有限,通常只能检测出部分错误类型,对于一些复杂的错误情况可能无法准确检测。
- 像其他一些简单校验方法一样,不能定位错误的具体位置,也无法进行纠错。
- 应用领域
- 在一些简单的通信协议中,尤其是对数据准确性要求不是特别高,但需要快速进行初步错误检测的场景,如某些工业控制通信、小型嵌入式系统的数据传输等。
- 网页工具
- 链接:http://www.ip33.com/bcc.html
- 以下是一个简单的 BCC(异或运算实现)的 C 代码示例:
unsigned char calculateBCC(unsigned char *data, int len) {unsigned char bcc = 0;for (int i = 0; i < len; i++) {bcc ^= data[i];}return bcc;
}
四、CRC(循环冗余校验)
- 原理
- 把待校验的数据看作一个二进制多项式,选择一个特定的生成多项式。将数据多项式乘以 x n x^n xn( n n n 为生成多项式的长度减 1)后,用生成多项式对其进行模 2 除法运算,得到的余数就是 CRC 校验码,最后将校验码附加到原始数据上进行传输或存储。
- 优点
- 具有较强的检测错误能力,可以检测多种类型的错误如随机错误、突发错误等。同时计算速度较快,能够利用硬件快速实现,而且可以通过选择不同的生成多项式灵活地适应各种应用和数据类型,计算开销相对而言比较小。
- 缺点
- 不能对错误进行纠正,并且对于某些特定的错误模式可能无法检测出来。
- 应用领域
- 在网络通信领域用于确保数据在传输过程中的完整性、存储系统中保障数据存储准确以及文件传输时检测数据是否出错等。
- 网页工具
- 链接:https://www.lddgo.net/encrypt/crc
- 以下是简单的 CRC 校验的 C 代码示例(以 CRC-8 为例):
unsigned char crc8_table[] = {0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD
};unsigned char crc8(unsigned char *data, int len) {unsigned char crc = 0;for (int i = 0; i < len; i++) {crc = crc8_table[crc ^ data[i]];}return crc;
}
五、海明码校验
- 原理
- 在原始数据中添加若干个校验位,按照特定的编码规则,使数据位和校验位之间建立起特定的关系。在接收端依据这些关系来检测错误并且纠正错误。
- 优点
- 纠错能力强大,不仅能够检测到数据中是否存在错误,还能精准确定错误的位置并且进行纠正。检测错误的能力也很全面,可以应对多种类型的错误情况。
- 缺点
- 计算过程比较复杂,编码和解码过程都需要进行大量计算,所以计算开销较大。并且因为要添加校验位,会导致数据冗余度增大,增加了数据传输量和存储量。
- 应用领域
- 在对数据可靠性有极高要求的领域,例如航空航天领域中保障飞行数据准确、军事领域确保关键信息无误等场景发挥重要作用。
- 网页工具
- 链接:https://www.23bei.com/tool/141.html
- 以下是一个简单的海明码编码的 C 代码示例(只是示意,实际应用可能需要更复杂的处理):
#include <stdio.h>
#include <math.h>int calculateParityBit(int *data, int bitPosition, int dataLength) {int count = 0;for (int i = bitPosition - 1; i < dataLength; i += (2 * bitPosition)) {for (int j = 0; j < bitPosition && i + j < dataLength; j++) {if (data[i + j]) {count++;}}}return count % 2;
}void encodeHammingCode(int *data, int dataLength) {int totalLength = dataLength + (int)ceil(log2(dataLength)) + 1;int *encodedData = (int *)malloc(totalLength * sizeof(int));int j = 0;for (int i = 1; i <= totalLength; i++) {if (i == (int)pow(2, j)) {encodedData[i - 1] = 0;j++;} else {encodedData[i - 1] = data[i - j - 1];}}j = 0;for (int i = 1; i <= totalLength; i++) {if (i == (int)pow(2, j)) {encodedData[i - 1] = calculateParityBit(encodedData, i, totalLength);j++;}}printf("Encoded Hamming Code: ");for (int i = 0; i < totalLength; i++) {printf("%d", encodedData[i]);}printf("\n");free(encodedData);
}
六、MD5(消息摘要算法第五版)和 SHA(安全哈希算法)系列
- 原理
- 通过一系列复杂的数学运算对输入的数据进行处理,最终生成固定长度的哈希值。只要输入数据稍有不同,生成的哈希值就会有很大差异。
- 优点
- 安全性很高,很难通过哈希值反向推导出原始数据,并且可以有效地用于检测数据的完整性,判断数据是否被篡改过。
- 缺点
- 计算过程复杂,计算开销较大。并且只能检测数据是否被篡改,不能对错误数据进行纠正。
- 应用领域
- 在文件校验方面可以确保文件在传输、存储等过程中不被破坏或篡改;在数字签名领域保障签名的安全性和可靠性;在密码存储方面能够对用户密码进行加密处理等。
- 网页工具
- 链接:https://www.metools.info/other/o21.html
- 使用 OpenSSL 库可以实现 MD5 和 SHA 系列算法,以下是 MD5 的示例代码:
#include <stdio.h>
#include <openssl/md5.h>void print_md5_sum(unsigned char *digest) {for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {printf("%02x", digest[i]);}printf("\n");
}int main() {const char *string = "Hello, World!";unsigned char digest[MD5_DIGEST_LENGTH];MD5_CTX ctx;MD5_Init(&ctx);MD5_Update(&ctx, string, strlen(string));MD5_Final(digest, &ctx);print_md5_sum(digest);return 0;
}