From 124f869faae3a0f75a3825e6a8e195c17f3c626a Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 16 Oct 2014 23:34:20 +0400 Subject: initial for idea --- .../main/java/com/github/junrar/crc/RarCRC.java | 145 +++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 org.fox.ttcomics/src/main/java/com/github/junrar/crc/RarCRC.java (limited to 'org.fox.ttcomics/src/main/java/com/github/junrar/crc/RarCRC.java') diff --git a/org.fox.ttcomics/src/main/java/com/github/junrar/crc/RarCRC.java b/org.fox.ttcomics/src/main/java/com/github/junrar/crc/RarCRC.java new file mode 100644 index 0000000..8a778ed --- /dev/null +++ b/org.fox.ttcomics/src/main/java/com/github/junrar/crc/RarCRC.java @@ -0,0 +1,145 @@ +/* + * 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)); +// +// } + +} -- cgit v1.2.3