diff options
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/crcchecker/CrcChecker.java')
| -rw-r--r-- | src/main/java/org/openslx/imagemaster/crcchecker/CrcChecker.java | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/main/java/org/openslx/imagemaster/crcchecker/CrcChecker.java b/src/main/java/org/openslx/imagemaster/crcchecker/CrcChecker.java new file mode 100644 index 0000000..882f565 --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/crcchecker/CrcChecker.java @@ -0,0 +1,80 @@ +package org.openslx.imagemaster.crcchecker; + +import java.io.IOException; +import java.util.zip.CRC32; + +public class CrcChecker +{ + private static final int blockSize = 16 * 1024 * 1024; + + private ImageFile imageFile; + private CrcFile crcFile; + + private byte[] block = new byte[ blockSize ]; // array that is used to read the blocks + + /** + * Initialize a crc checker with an image file and a crc file. + * + * @param imageFile The image file to check + * @param crcFile The crc file to check against + */ + public CrcChecker( ImageFile imageFile, CrcFile crcFile ) + { + this.imageFile = imageFile; + this.crcFile = crcFile; + } + + public void done() + { + imageFile.close(); + } + + public boolean hasValidCrcFile() + { + try { + return crcFile.isValid(); + } catch ( IOException e ) { + return false; + } + } + + /** + * Checks a chosen block against the crc file. + * + * @param block The block to check + * @return Whether the block was valid or not + * @throws IOException When image or crc file could not be read. + */ + public boolean checkBlock( int blockNumber ) throws IOException + { + if ( !this.hasValidCrcFile() ) + return false; + + int length; + try { + length = imageFile.getBlock( blockNumber, block ); + } catch ( IOException e ) { + throw new IOException( "image", e ); + } + + if ( length <= 0 ) + return false; + + CRC32 crcCalc = new CRC32(); + if ( length == blockSize ) { + crcCalc.update( block ); + } else { + crcCalc.update( block, 0, length ); + } + + int crcSum = Integer.reverseBytes( (int)crcCalc.getValue() ); + int crcSumFromFile; + try { + crcSumFromFile = crcFile.getCRCSum( blockNumber ); + } catch ( IOException e ) { + throw new IOException( "crc", e ); + } + + return ( crcSum == crcSumFromFile ); + } +} |
