一. 什么是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