com.github.junrar.crc.RarCRC Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of junrar Show documentation
Show all versions of junrar Show documentation
rar decompression library in plain java
/*
* Copyright (c) 2007 innoSysTec (R) GmbH, Germany. All rights reserved.
* Original author: Edmund Wagner
* Creation date: 29.05.2007
*
* Source: $HeadURL$
* Last changed: $LastChangedDate$
*
* the unrar licence applies to all junrar source and binary distributions
* you are not allowed to use this source to re-create the RAR compression algorithm
*
* Here some html entities which can be used for escaping javadoc tags:
* "&": "&" or "&"
* "<": "<" or "<"
* ">": ">" or ">"
* "@": "@"
*/
package com.github.junrar.crc;
/**
* DOCUMENT ME
*
* @author $LastChangedBy$
* @version $LastChangedRevision$
*/
public class RarCRC {
private final static int crcTab[];
static {
crcTab = new int[256];
for (int i = 0; i < 256; i++) {
int c = i;
for (int j = 0; j < 8; j++){
if ((c & 1) !=0) {
c >>>= 1;
c ^= 0xEDB88320;
}
else{
c >>>= 1;
}
}
crcTab[i] = c;
}
}
private RarCRC() {
}
public static int checkCrc(int startCrc, byte[] data, int offset,
int count) {
int size = Math.min(data.length-offset,count);
// #if defined(LITTLE_ENDIAN) && defined(PRESENT_INT32) &&
// defined(ALLOW_NOT_ALIGNED_INT)
/*
for (int i = 0; (0 < size) && i < data.length - 8
&& ((data[i + 8] & 7) != 0); i++) {
startCrc = crcTab[(short) (startCrc ^ data[i]) & 0x00FF] ^ (startCrc >>> 8);
size--;
}
for (int i = 0; size >= 8; i += 8) {
startCrc ^= data[i + 0] << 24;
startCrc ^= data[i + 1] << 16;
startCrc ^= data[i + 2] << 8;
startCrc ^= data[i + 3];
startCrc = crcTab[(short) startCrc & 0x00FF] ^ (startCrc >>> 8);
startCrc = crcTab[(short) startCrc & 0x00FF] ^ (startCrc >>> 8);
startCrc = crcTab[(short) startCrc & 0x00FF] ^ (startCrc >>> 8);
startCrc = crcTab[(short) startCrc & 0x00FF] ^ (startCrc >>> 8);
startCrc ^= data[i + 4] << 24;
startCrc ^= data[i + 5] << 16;
startCrc ^= data[i + 6] << 8;
startCrc ^= data[i + 7];
startCrc = crcTab[(short) startCrc & 0x00FF] ^ (startCrc >>> 8);
startCrc = crcTab[(short) startCrc & 0x00FF] ^ (startCrc >>> 8);
startCrc = crcTab[(short) startCrc & 0x00FF] ^ (startCrc >>> 8);
startCrc = crcTab[(short) startCrc & 0x00FF] ^ (startCrc >>> 8);
size -= 8;
}*/
for (int i = 0; i < size; i++)
{
/*
// (byte)(StartCRC^Data[I])
int pos = 0; // pos=0x00000000
pos |= startCrc; // pos=ffffffff
pos ^= data[i]; // data[0]=0x73=115dec --> pos=140
System.out.println(Integer.toHexString(pos));
// Only last 8 bit because CRCtab has length 256
pos = pos & 0x000000FF;
System.out.println("pos:"+pos);
//startCrc >>>= 8;
//StartCRC>>8
int temp =0;
temp|=startCrc;
temp >>>= 8;
System.out.println("temp:"+Integer.toHexString(temp));
startCrc = (crcTab[pos]^temp);
System.out.println("--"+Integer.toHexString(startCrc));*/
startCrc=(crcTab[((int)((int)startCrc ^
(int)data[offset+i]))&0xff]^(startCrc>>>8));
//System.out.println(Integer.toHexString(startCrc));
// Original code:
//StartCRC=CRCTab[(byte)(StartCRC^Data[I])]^(StartCRC>>8);
}
return (startCrc);
}
public static short checkOldCrc(short startCrc, byte[] data, int count) {
int n = Math.min(data.length, count);
for (int i = 0; i < n; i++) {
startCrc = (short) ((short) (startCrc + (short) (data[i]&0x00ff)) & -1);
startCrc = (short) (((startCrc << 1) | (startCrc >>> 15)) & -1);
}
return (startCrc);
}
// public static void main(String[] args)
// {
// RarCRC rc = new RarCRC();
// //byte[] data = { 0x72, 0x21, 0x1A, 0x07, 0x00};
//
// byte[] data = {0x73 ,0x00 ,0x00 ,0x0D ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00};
//
// int crc = 0x90CF;
//
//
// int result = rc.checkCrc(0xFFFFffff, data,0,data.length);
// System.out.println("3: "+Integer.toHexString(~result&0xffff));
//
// }
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy