All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sourceforge.javaflacencoder.CRC8 Maven / Gradle / Ivy

Go to download

javaFlacEncoder is a pure java implementation of a FLAC encoder library. It is designed to allow third-party java applications to enable flac encoding without resorting to use of JNI or scripted file conversions. Additionally, a basic console wav->flac encoding tool is included as part of this package. Original project can be found here: http://javaflacencoder.sourceforge.net/

The newest version!
/*
 * Copyright (C) 2010  Preston Lacey http://javaflacencoder.sourceforge.net/
 * All Rights Reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

package net.sourceforge.javaflacencoder;


/**
 * Class to calculate a CRC8 checksum.
 * @author Preston Lacey
 */
public class CRC8 {

  /** For Debugging: Higher level equals more debug statements */
  public static int DEBUG_LEV = 0;

  /** CRC Divisor: 0x107 */
  static final int divisorCRC8 = 0x107 << 23;

  /** working checksum stored between calls to update(..) */
  int workingCRC8;

  /** number of valid bits stored in workingCRC8(valid bits are packed towards
   * high-order side of int */
  int workingCRC8Count;

  private static final byte[] fake = {0};

  /**
   * Constructor. Creates a CRC8 object that is ready to be used. Next step
   * would be to call updateCRC8 with appropriate data.
   */
  public CRC8() {
    reset();
  }

  /**
   * Add data to the crc. Immediately creates checksum on given data. Can be
   * called multiple times as it won't finalize the checksum until the method
   * checksum() is called.
   *
   * @param inSet Array holding data to checksum.
   * @param start Index of array holding first element
   * @param end Index to stop at. Last index used will be end-1.
   * @return intermediate result of checksum to this point. This is *not* a
   * finalized result, as non-summed data must remain in workingCRC8 until
   * checksum() is called.
   */
  public byte updateCRC8(byte[] inSet, int start, int end) {
    //we need at least one byte to work on. And cache between calls.
    //  Follow md5 style, updating many times, finalizing once.

    //Copy in saved value(starts out zero).
    //Shift value, and divisor to top end of int. When we drop below 17 in
    //  working int, "OR" it with another byte, or save and return.
    //  I won't do this, just "assume" it's already there and use instance
    //  variables.
    //While bits available is more than 8:
    //while top bit is zero, and >8 bits in buffer. Shift Left.
    //if >8 bits remain in working int, divide
    //else if 8 bits remain, "OR" in another byte.
    //store working int, return;
    if(DEBUG_LEV > 10 )
      System.err.println("CRC8::updateCRC8: Begin");
      if(DEBUG_LEV > 20) {
      System.err.println("Start:End : "+start+":"+end);
    }
    int current = start;
    int topBit = 0;
    int topMask = 1<<31;
    while(current < end) {//this should leave 8 bits in workingCRC8.
      if(DEBUG_LEV > 40 ) {
        System.err.println("CRC8::updateCRC8: looping bytes. current: "+current);
        System.err.println("workingCRC8Count : " +workingCRC8Count);
      }
      topBit = workingCRC8 & topMask;
      while(workingCRC8Count > 8 && topBit == 0) {
        if(DEBUG_LEV > 40)
          System.err.println("CRC8::updateCRC8:  shifting left");
        workingCRC8Count--;
        workingCRC8 = workingCRC8 << 1;
        topBit = workingCRC8 & topMask;
      }
      if( workingCRC8Count > 8 ) {
        workingCRC8 = workingCRC8 ^ divisorCRC8;
      }
      else {//workingCRC8Count < 9
        if(DEBUG_LEV > 30) {
          System.err.println("CRC8: Adding byte with workingCRC of: "+
          (workingCRC8 >>> 24));
        }
        int temp = inSet[current++];
        temp = temp << 24;
        temp = temp >>> 8;
        workingCRC8 = workingCRC8 | temp;
        workingCRC8Count+=8;
      }
    }
    return (byte)(workingCRC8 >>> 24);
    }

  /**
   * Finalize the checksum, and return the value. After this is called, you
   * must call reset() before attempting a new checksum.
   * @return finalized checksum.
   */
  public byte checksum() {
    if(DEBUG_LEV > 10 )
      System.err.println("CRC8::checksum : Begin");
    //add 8 to the count,
    //call update with a byte constructed to add no more.
    //byte[] fake = {0};
    workingCRC8Count += 8;
    byte val = updateCRC8(fake, 0, 1);
    if(DEBUG_LEV > 10 )
      System.err.println("CRC8::checksum : End");
    return val;
  }

  /**
   * Resets all stored data, preparing object for a new checksum.
   */
  public void reset() {
    workingCRC8 = 0;
    workingCRC8Count = 8;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy