/**
 * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
 */

package org.onosproject.xran.codecs.api;

import java.io.IOException;
import java.io.EOFException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.io.Serializable;
import org.onosproject.xran.codecs.ber.*;
import org.onosproject.xran.codecs.ber.types.*;
import org.onosproject.xran.codecs.ber.types.string.*;

import javax.xml.bind.DatatypeConverter;


public class CRNTI extends BerBitString {

	private static final long serialVersionUID = 1L;

	public CRNTI() {
	}

	public CRNTI(byte[] code) {
		super(code);
	}

	public CRNTI(byte[] value, int numBits) {
		super(value, numBits);
	}

	@Override
	public int hashCode() {
		return Arrays.hashCode(value);
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof CRNTI) {
			return Arrays.equals(value, ((CRNTI) obj).value);
		}
		return super.equals(obj);
	}

	@Override
	public String toString() {
		return "" + DatatypeConverter.printHexBinary(value) + "";
	}
}
