• 【Java】CRC32Utils(CRC-32 工具类)


    Java CRC-32 工具类

    /**
     * CRC-32
     * 
     * <table width="400px" border="1" cellpadding="0" cellspacing="0">
     *     <tr>
     *         <th>名称</th>
     *         <th>多项式</th>
     *         <th>初始值</th>
     *         <th>异或值</th>
     *         <th>Bit反转</th>
     *     </tr>
     *     <tr>
     *         <td>&nbsp; CRC-32</td>
     *         <td align="center">0x04C11DB7</td>
     *         <td align="center">0xFFFFFFFF</td>
     *         <td align="center">0xFFFFFFFF</td>
     *         <td align="center">LSB First</td>
     *     </tr>
     *     <tr>
     *         <td>&nbsp; CRC-32/B</td>
     *         <td align="center">0x04C11DB7</td>
     *         <td align="center">0xFFFFFFFF</td>
     *         <td align="center">0xFFFFFFFF</td>
     *         <td align="center">MSB First</td>
     *     </tr>
     *     <tr>
     *         <td>&nbsp; CRC-32/C</td>
     *         <td align="center">0x1EDC6F41</td>
     *         <td align="center">0xFFFFFFFF</td>
     *         <td align="center">0xFFFFFFFF</td>
     *         <td align="center">LSB First</td>
     *     </tr>
     *     <tr>
     *         <td>&nbsp; CRC-32/D</td>
     *         <td align="center">0xA833982B</td>
     *         <td align="center">0xFFFFFFFF</td>
     *         <td align="center">0xFFFFFFFF</td>
     *         <td align="center">LSB First</td>
     *     </tr>
     *     <tr>
     *         <td>&nbsp; CRC-32/MPEG-2</td>
     *         <td align="center">0x04C11DB7</td>
     *         <td align="center">0xFFFFFFFF</td>
     *         <td align="center">0x00000000</td>
     *         <td align="center">MSB First</td>
     *     </tr>
     *     <tr>
     *         <td>&nbsp; CRC-32/POSIX</td>
     *         <td align="center">0x04C11DB7</td>
     *         <td align="center">0x00000000</td>
     *         <td align="center">0xFFFFFFFF</td>
     *         <td align="center">MSB First</td>
     *     </tr>
     * </table>
     * 
     * @author unnamed
     *
     */
    public class CRC32Utils {
    
        /**
         * CRC-32
         * 
         * <table width="400px" border="1" cellpadding="0" cellspacing="0">
         *     <tr>
         *         <th>多项式</th>
         *         <th>初始值</th>
         *         <th>异或值</th>
         *         <th>Bit反转</th>
         *     </tr>
         *     <tr>
         *         <td align="center">0x04C11DB7</td>
         *         <td align="center">0xFFFFFFFF</td>
         *         <td align="center">0xFFFFFFFF</td>
         *         <td align="center">LSB First</td>
         *     </tr>
         * </table>
         * 
         * @param  source
         * @param  offset
         * @param  length
         * @return
         */
        public static long CRC32(byte[] source, int offset, int length) {
            long wCRCin = 0xFFFFFFFFL;
            // Long.reverse(0x04C11DB7L) >>> 32
            long wCPoly = 0xEDB88320L;
            for (int i = offset, cnt = offset + length; i < cnt; i++) {
                wCRCin ^= ((long) source[i] & 0x000000FFL);
                for (int j = 0; j < 8; j++) {
                    if ((wCRCin & 0x00000001L) != 0) {
                        wCRCin >>= 1;
                        wCRCin ^= wCPoly;
                    } else {
                        wCRCin >>= 1;
                    }
                }
            }
            return wCRCin ^= 0xFFFFFFFFL;
        }
    
        /**
         * CRC-32/B
         * 
         * <table width="400px" border="1" cellpadding="0" cellspacing="0">
         *     <tr>
         *         <th>多项式</th>
         *         <th>初始值</th>
         *         <th>异或值</th>
         *         <th>Bit反转</th>
         *     </tr>
         *     <tr>
         *         <td align="center">0x04C11DB7</td>
         *         <td align="center">0xFFFFFFFF</td>
         *         <td align="center">0xFFFFFFFF</td>
         *         <td align="center">MSB First</td>
         *     </tr>
         * </table>
         * 
         * @param  source
         * @param  offset
         * @param  length
         * @return
         */
        public static long CRC32_B(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 ^= 0xFFFFFFFFL;
        }
    
        /**
         * CRC-32/C
         * 
         * <table width="400px" border="1" cellpadding="0" cellspacing="0">
         *     <tr>
         *         <th>多项式</th>
         *         <th>初始值</th>
         *         <th>异或值</th>
         *         <th>Bit反转</th>
         *     </tr>
         *     <tr>
         *         <td align="center">0x1EDC6F41</td>
         *         <td align="center">0xFFFFFFFF</td>
         *         <td align="center">0xFFFFFFFF</td>
         *         <td align="center">LSB First</td>
         *     </tr>
         * </table>
         * 
         * @param  source
         * @param  offset
         * @param  length
         * @return
         */
        public static long CRC32_C(byte[] source, int offset, int length) {
            long wCRCin = 0xFFFFFFFFL;
            // Long.reverse(0x1EDC6F41L) >>> 32
            long wCPoly = 0x82F63B78L;
            for (int i = offset, cnt = offset + length; i < cnt; i++) {
                wCRCin ^= ((long) source[i] & 0x000000FFL);
                for (int j = 0; j < 8; j++) {
                    if ((wCRCin & 0x00000001L) != 0) {
                        wCRCin >>= 1;
                        wCRCin ^= wCPoly;
                    } else {
                        wCRCin >>= 1;
                    }
                }
            }
            return wCRCin ^= 0xFFFFFFFFL;
        }
    
        /**
         * CRC-32/D
         * 
         * <table width="400px" border="1" cellpadding="0" cellspacing="0">
         *     <tr>
         *         <th>多项式</th>
         *         <th>初始值</th>
         *         <th>异或值</th>
         *         <th>Bit反转</th>
         *     </tr>
         *     <tr>
         *         <td align="center">0xA833982B</td>
         *         <td align="center">0xFFFFFFFF</td>
         *         <td align="center">0xFFFFFFFF</td>
         *         <td align="center">LSB First</td>
         *     </tr>
         * </table>
         * 
         * @param  source
         * @param  offset
         * @param  length
         * @return
         */
        public static long CRC32_D(byte[] source, int offset, int length) {
            long wCRCin = 0xFFFFFFFFL;
            // Long.reverse(0xA833982BL) >>> 32
            long wCPoly = 0xD419CC15L;
            for (int i = offset, cnt = offset + length; i < cnt; i++) {
                wCRCin ^= ((long) source[i] & 0x000000FFL);
                for (int j = 0; j < 8; j++) {
                    if ((wCRCin & 0x00000001L) != 0) {
                        wCRCin >>= 1;
                        wCRCin ^= wCPoly;
                    } else {
                        wCRCin >>= 1;
                    }
                }
            }
            return wCRCin ^= 0xFFFFFFFFL;
        }
    
        /**
         * CRC-32/MPEG-2
         * 
         * <table width="400px" border="1" cellpadding="0" cellspacing="0">
         *     <tr>
         *         <th>多项式</th>
         *         <th>初始值</th>
         *         <th>异或值</th>
         *         <th>Bit反转</th>
         *     </tr>
         *     <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;
        }
    
        /**
         * CRC-32/POSIX
         * 
         * <table width="400px" border="1" cellpadding="0" cellspacing="0">
         *     <tr>
         *         <th>多项式</th>
         *         <th>初始值</th>
         *         <th>异或值</th>
         *         <th>Bit反转</th>
         *     </tr>
         *     <tr>
         *         <td align="center">0x04C11DB7</td>
         *         <td align="center">0x00000000</td>
         *         <td align="center">0xFFFFFFFF</td>
         *         <td align="center">MSB First</td>
         *     </tr>
         * </table>
         * 
         * @param  source
         * @param  offset
         * @param  length
         * @return
         */
        public static long CRC32_POSIX(byte[] source, int offset, int length) {
            long wCRCin = 0x00000000L;
            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 ^= 0xFFFFFFFFL;
        }
    
    }
    
    
  • 相关阅读:
    Django重要组件(Auth模块)
    Django框架深入了解(总结整理)
    ORM(数据库对象关系映射)代码重写
    Django框架深入了解——DRF之序列化、反序列化
    让无线更自由 TOTOLINK EX750无线中继评测
    matlab常用知识
    点云数据
    运动恢复结构
    Ubuntu下简单的QT绘图程序
    英语词语解释
  • 原文地址:https://www.cnblogs.com/zhuzhongxing/p/14147098.html
Copyright © 2020-2023  润新知