一. 什么是crc
CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式。在嵌入式软件开发中,经常要用到CRC 算法对各种数据进行校验。因此,掌握基本的CRC算法应是嵌入式程序员的基本技能。可是,我认识的嵌入式程序员中能真正掌握CRC算法的人却很少,平常在项目中见到的CRC的代码多数都是那种效率非常低下的实现方式(crc32)
(1) 什么叫做多项式
CRC多项式是为了生成一个除数,这个除数是模二运算的除数
示例:, 多项式生成的二进制序列位数是最高次幂加一,即6位,即从第0位开始到第5位,多项式中为0的位已经省略,原式为:(0次幂为1),幂次数也即其位置,即:100101
如上,生成的二进制序列即为crc检验用到的除数,而crc校验码即数据补0后除(模二运算除)以这个除数后的余数,检验码位数比除数少一位,余数不足的位用0补足,数据补0即在原始数据后加上除数位数减一的0.
示例:原始数据:10110011, 多项式:
多项式生成除数序列:11001
原始数据补零:10110011 0000 (除数为五位,故补4个0)
10110011 0000 除以 11001 = 0100,即校验码:0100
原始数据+crc校验码发送给接收端,即该序列除以多项式生成的除数得到余数为0
接收端用收到的数据除以多项式生成的除数,若余数为0则数据正确,否则数据出错
常见的参数模型:
二 如何实现crc
* CRC-32/MPEG-2
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <td align="center">0x04C11DB7</td>
* <td align="center">0xFFFFFFFF</td>
* <td align="center">0x00000000</td>
* <td align="center">MSB First</td>
* </tr>
* </table>
* @param source
* @param offset
* @param length
* @return
public static long CRC32_MPEG_2(byte[] source, int offset, int length) {
long wCRCin = 0xFFFFFFFFL;
long wCPoly = 0x04C11DB7L;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
for (int j = 0; j < 8; j++) {
boolean bit = ((source[i] >> (7 - j) & 1) == 1);
boolean c31 = ((wCRCin >> 31 & 1) == 1);
wCRCin <<= 1;
if (c31 ^ bit) {
wCRCin ^= wCPoly;
wCRCin &= 0xFFFFFFFFL;
return wCRCin ^= 0x00000000L;
对输入数据反转:
(1)什么叫做输入数据反转:
输入数据反转,将输入的数据转化为byte[]后进行循环将每一个bit字节进行转换后输入到crc算法中;
public static byte reverseBits(byte b) {
byte result = 0;
for (int i = 0; i < 8; i++) {
result <<= 1;
result |= (b & 1);
b >>= 1;
return result;
对输出数据反转
(1)对已经生成的crc进行数据转换
public static long reverseBits(long value) {
long reversedValue = 0;
for (int i = 0; i < 32; i++) {
reversedValue = (reversedValue << 1) | (value & 1);
value >>= 1;
return reversedValue;
private String normalData(String message, String signature) {
long crc32Mpeg2 = AESUtil.CRC32_MPEG_2(replace.getBytes(), 0, replace.length());
return Long.toHexString(crc32Mpeg2);
myPath="/var/log/httpd/"
myFile="/var /log/httpd/access.log"
#这里的-x 参数判断$myPath是否存在并且是否具有可执行权限
if [ ! -x "$myPath"]; then
mkdir "$myPath"
#这里的-d 参数判断$myPath是否存在
if [ ! -d "$myPat