1、CRC校验
使用7Z 开源SDK中提供的功能类
// SevenZip/CRC.java package SevenZip; public class CRC { static public int[] Table = new int[256]; static { for (int i = 0; i < 256; i++) { int r = i; for (int j = 0; j < 8; j++) if ((r & 1) != 0) r = (r >>> 1) ^ 0xEDB88320; else r >>>= 1; Table[i] = r; } } int _value = -1; public void Init() { _value = -1; } public void Update(byte[] data, int offset, int size) { for (int i = 0; i < size; i++) _value = Table[(_value ^ data[offset + i]) & 0xFF] ^ (_value >>> 8); } public void Update(byte[] data) { int size = data.length; for (int i = 0; i < size; i++) _value = Table[(_value ^ data[i]) & 0xFF] ^ (_value >>> 8); } public void UpdateByte(int b) { _value = Table[(_value ^ b) & 0xFF] ^ (_value >>> 8); } public int GetDigest() { return _value ^ (-1); } }边读取文件内容边计算CRC
public static int CalCRC(String strFile){ int nResult = 0; File file = new File(strFile); if ( !file.exists() ){ System.out.println("文件:" + strFile + "不存在!"); return nResult; } FileInputStream fis = null; try{ fis = new FileInputStream(file); byte[] buff = new byte[1024]; CRC crc = new CRC(); crc.Init(); while ( true ){ int nRead = fis.read(buff); if ( nRead >0 ) crc.Update(buff, 0, nRead); if ( nRead < 1024 ) break; } nResult = crc.GetDigest(); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if ( fis != null ) fis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return nResult; }返回的是一个int类型数据,为了更便于阅读我们通常将其转成16进制显示
//10进制转16进制 public static String IntToHex(int n, boolean bUseFlag){ char[] ch = new char[20]; int nIndex = 0; while ( true ){ int m = n/16; int k = n%16; if ( k == 15 ) ch[nIndex] = 'F'; else if ( k == 14 ) ch[nIndex] = 'E'; else if ( k == 13 ) ch[nIndex] = 'D'; else if ( k == 12 ) ch[nIndex] = 'C'; else if ( k == 11 ) ch[nIndex] = 'B'; else if ( k == 10 ) ch[nIndex] = 'A'; else ch[nIndex] = (char)('0' + k); nIndex++; if ( m == 0 ) break; n = m; } StringBuffer sb = new StringBuffer(); sb.append(ch, 0, nIndex); sb.reverse(); String strHex = null; if ( bUseFlag ) strHex = new String("0x"); else strHex = new String(); strHex += sb.toString(); return strHex; }
使用java.security.MessageDigest中为我们提供的接口
public static String CalFileMd5(String strFile) throws Exception{ File file = new File(strFile); if ( !file.exists() ){ throw new Exception("file not exists!"); } String str = new String(); FileInputStream fis = null; try{ fis = new FileInputStream(file); MessageDigest md5 = MessageDigest.getInstance("MD5"); int nBuffLen = 10*1024; //10KB byte[] buff = new byte[nBuffLen]; while( true ){ int nRead = fis.read(buff); if ( nRead>0 ) md5.update(buff, 0, nRead); if ( nRead<nBuffLen ) break; } byte[] bMd5 = md5.digest(); StringBuffer sb = new StringBuffer("0x"); for ( int i=0; i<bMd5.length; ++i ){ sb.append(ByteToHex(bMd5[i])); } str = sb.toString(); } catch (NoSuchAlgorithmException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } finally{ if ( fis != null ) fis.close(); } return str; }
String strFile = new String("C:\\2.gif"); int nRet = CalCRC(strFile); System.out.println("CRC32 = " + IntToHex(nRet, true)); try { System.out.println("MD5 = " + Md5.CalFileMd5(strFile)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
CRC32 = 0xD4AC9DE
MD5 = 0xC09CF4902BFB284B5C34D28C545090
与其他软件计算的值对比: