checksum就是校验码,和md5的概念可以说是一样的,只是算法不一样.
checksum的算法也都不一样,看定的协议是怎么样的
我这边的业务场景是需要android端给打印机发送一个升级指令,两个是由蓝牙通讯的,打印机就需要校验下升级文件
我们定的checksum协议:将实际文件按无符号字节类型累加,保留低4字节
注:因为java里面默认的类型都是有符号类型的,所以需要先把文件的字节转成无符号类型的累加 就OK了. 直接上代码,注释都很清楚
byte[] write =new byte[(int)upgradeFile.length()]; //升级文件先写到字节数组中 FileInputStream inputStream= null; try { inputStream = new FileInputStream(upgradeFile); inputStream.read(write); inputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } int fileByte=0; //做累加 for (byte b:write) { fileByte+=b&0xff; //b&0xff 就是将字节转为无符号类型的 } byte[] loB4=intToBytes(fileByte); //checksum 取低四字节
/** * 将int数值转换为占四个字节的byte数组 * @param value * 要转换的int值 * @return byte数组 */ public static byte[] intToBytes( int value ) { byte[] src = new byte[4]; src[3] = (byte) ((value>>24) & 0xFF); src[2] = (byte) ((value>>16) & 0xFF); src[1] = (byte) ((value>>8) & 0xFF); src[0] = (byte) (value & 0xFF); return src; }
代码很简单这样子checksum就算完了
刚开始做的时候浪费了一点时间 就是因为不知道java默认都是有符号类型的, 累加完了才转为无符号类型.