基于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;
}
}
}
学会了吗,屏幕前的你?
我有多喜欢你,可能我自己都描述不出来,就像你是月亮,我是星星,满天星河只为你
来源:oschina
链接:https://my.oschina.net/u/4299119/blog/4318705