基于Java的32位CRC校验分享

蹲街弑〆低调 提交于 2020-07-26 23:42:19

基于Java的32位CRC校验分享

  • 经验分享:Java32位校验,String转byte[],byte[]校验完成返回String
  • 笔者公司是物联网公司,所以对接硬件协议那是常有的事情,各种16进制的UPD/Zigbee文档。。。。。。今天来分享一下我与CRC的爱恨情仇
1. 都是程序员,话不多说直接进入正题,首先你手上有一坨String类型16进制字符串。你需要把这坨字符串丢到某各地方,某个地方再回你一坨你想要的东西 (不用说你们也知道是什么了吧------当然是校验结果)

好的说到这里,上代码!!!

//首先把手里的字符串转为Byte数组
public static byte[] getHexBytes(String str){
        byte[] bytes = new byte[str.length() / 2];
        for(int i = 0; i < str.length() / 2; i++) {
            String subStr = str.substring(i * 2, i * 2 + 2);
            bytes[i] = (byte) Integer.parseInt(subStr, 16);
        }
        return bytes;
    }
2. 这样呢,我们拿到了一个数组,然后改干什么? ------当然是丢进去校验了,具体过程:先这样,再这样,再这样…

好的说到这里,上代码!!!

//扔进来校验
    public static String getCRCValues(byte[] b){
        CRC32 c = new CRC32();
        c.reset();//Resets CRC-32 to initial value.
        //将数据丢入CRC32解码器
        c.update(b, 0, b.length);
        //获取CRC32 的值  默认返回值类型为long 用于保证返回值是一个正数
        int value = (int) c.getValue();
        //转为16进制
        String value_string = Integer.toHexString(value);
        return value_string;
    }
3. 好的,到了这里我们手里有了校验后的一个字符串,但是这个字符串在并没有补 0,比如说第一位是 “0A”,实际上它是 “A”。怎么理解呢?就比如正确的校验结果本应该是 ***“0D997DFF”***,实际上它会返回 ***“D997DFF”***,我们做个简单的补 0 就好了,这个操作有手就行。。。

好的说到这里,上代码!!!

//16进制补零
    public static String getRightLengths(String hexs){
    //如果长度为7,给前面加个0
        if (hexs.length() == 7){
            return 0+hexs;
        }else{
            return hexs;
        }
    }
4. 到此为止,我们就实现了扔进去字符串,返回校验结果。就是这么简单而已,下面,笔者公布完整代码!!!没看懂的萌新可以加上我讨论,资料有V

好的说到这里,上代码!!!

public class CRCUtils {

    /**
     * @author MaChu!
     * 调用这个就可以啦
     * @param hexs
     * @return
     */
    public String getCRCString(String hexs) {
        //用于验证的数据
        byte[] b = getHexBytes(hexs);
        //得到校验后的字符串
        String value_string = getCRCValues(b);
        //补0 返回字符串
        return getRightLengths(value_string);
    }

    //扔进来校验
    public static String getCRCValues(byte[] b){
        CRC32 c = new CRC32();
        c.reset();//Resets CRC-32 to initial value.
        c.update(b, 0, b.length);//将数据丢入CRC32解码器
        int value = (int) c.getValue();//获取CRC32 的值  默认返回值类型为long 用于保证返回值是一个正数
        //转为16进制
        String value_string = Integer.toHexString(value);
        return value_string;
    }

    //将16进制的字符串转成字符数组
    public static byte[] getHexBytes(String str){
        byte[] bytes = new byte[str.length() / 2];
        for(int i = 0; i < str.length() / 2; i++) {
            String subStr = str.substring(i * 2, i * 2 + 2);
            bytes[i] = (byte) Integer.parseInt(subStr, 16);
        }
        return bytes;
    }

    //16进制补零
    public static String getRightLengths(String hexs){
        if (hexs.length() == 7){
            return 0+hexs;
        }else{
            return hexs;
        }
    }

}

学会了吗,屏幕前的你?

我有多喜欢你,可能我自己都描述不出来,就像你是月亮,我是星星,满天星河只为你

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!