You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by we...@apache.org on 2004/01/28 22:16:04 UTC
svn commit: rev 6338 - incubator/directory/snickers/trunk/ber/src/java/org/apache/snickers/asn
Author: wesmckean
Date: Wed Jan 28 13:16:04 2004
New Revision: 6338
Added:
incubator/directory/snickers/trunk/ber/src/java/org/apache/snickers/asn/
incubator/directory/snickers/trunk/ber/src/java/org/apache/snickers/asn/BitString.java
Log:
initial load of BitString class
Added: incubator/directory/snickers/trunk/ber/src/java/org/apache/snickers/asn/BitString.java
==============================================================================
--- (empty file)
+++ incubator/directory/snickers/trunk/ber/src/java/org/apache/snickers/asn/BitString.java Wed Jan 28 13:16:04 2004
@@ -0,0 +1,262 @@
+/*
+
+ ============================================================================
+ The Apache Software License, Version 1.1
+ ============================================================================
+
+ Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ 3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment: "This product includes software
+ developed by the Apache Software Foundation (http://www.apache.org/)."
+ Alternately, this acknowledgment may appear in the software itself, if
+ and wherever such third-party acknowledgments normally appear.
+
+ 4. The names "Eve Directory Server", "Apache Directory Project", "Apache Eve"
+ and "Apache Software Foundation" must not be used to endorse or promote
+ products derived from this software without prior written
+ permission. For written permission, please contact apache@apache.org.
+
+ 5. Products derived from this software may not be called "Apache", nor may
+ "Apache" appear in their name, without prior written permission of the
+ Apache Software Foundation.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This software consists of voluntary contributions made by many individuals
+ on behalf of the Apache Software Foundation. For more information on the
+ Apache Software Foundation, please see <http://www.apache.org/>.
+
+*/
+
+package org.apache.snickers.asn;
+
+import org.apache.commons.codec.binary.Binary;
+
+/**
+ * @author Wes McKean
+ *
+ * Encapsulates the basic functionality of a bit string
+ */
+public class BitString {
+
+ /** The bits that make up this bit string */
+ int[] bits = null;
+
+ /** The number of bits */
+ int numbits;
+
+ private static final int[] bitflags = {
+ (1 << 0 ),
+ (1 << 1 ),
+ (1 << 2 ),
+ (1 << 3 ),
+ (1 << 4 ),
+ (1 << 5 ),
+ (1 << 6 ),
+ (1 << 7 ),
+ (1 << 8 ),
+ (1 << 9 ),
+ (1 << 10 ),
+ (1 << 11 ),
+ (1 << 12 ),
+ (1 << 13 ),
+ (1 << 14 ),
+ (1 << 15 ),
+ (1 << 16 ),
+ (1 << 17 ),
+ (1 << 18 ),
+ (1 << 19 ),
+ (1 << 20 ),
+ (1 << 21 ),
+ (1 << 22 ),
+ (1 << 23 ),
+ (1 << 24 ),
+ (1 << 25 ),
+ (1 << 26 ),
+ (1 << 27 ),
+ (1 << 28 ),
+ (1 << 29 ),
+ (1 << 30 ),
+ (1 << 31 )
+ };
+
+ /**
+ * The basic constructor for a BitString
+ */
+ public BitString( int[] bits, int numbits ) {
+ super();
+
+ this.bits = new int[ bits.length ];
+ System.arraycopy( bits, 0, this.bits, 0, bits.length );
+ this.numbits = numbits;
+ }
+
+ /**
+ * Performs a binary and on the passed in BitString
+ *
+ * @param value the BitString to and against this one
+ * @return a new BitString of the combined values. Please
+ * note that the result will have the length of
+ * the largest BitString.
+ */
+ public BitString and( BitString value ) {
+ BitString result = null;
+
+ int min = ((bits.length < value.bits.length) ? bits.length : value.bits.length);
+ int length = ((bits.length > value.bits.length) ? bits.length : value.bits.length);
+ int[] l_bits = new int[ length ];
+ java.util.Arrays.fill( l_bits, 0 );
+
+ for( int i = 0; i < min; i++ ) {
+ l_bits[i] = (bits[i] & value.bits[i]);
+ }
+
+ int l_numbits = getLength() > value.getLength() ? getLength() : value.getLength();
+ result = new BitString( l_bits, l_numbits );
+ return result;
+ }
+
+ /**
+ * Performs a binary or on the passed in BitString
+ *
+ * @param value the BitString to or against this one
+ * @return a new BitString of the combined values. Please
+ * note that the result will have the length of
+ * the largest BitString.
+ */
+ public BitString or( BitString value ) {
+ BitString result = null;
+
+ int min = ((bits.length < value.bits.length) ? bits.length : value.bits.length);
+ int length = ((bits.length > value.bits.length) ? bits.length : value.bits.length);
+ int[] l_bits = new int[ length ];
+ java.util.Arrays.fill( l_bits, 0 );
+
+ for( int i = 0; i < min; i++ ) {
+ l_bits[i] = (bits[i] | value.bits[i]);
+ }
+
+ int l_numbits = getLength() > value.getLength() ? getLength() : value.getLength();
+ result = new BitString( l_bits, l_numbits );
+ return result;
+ }
+
+ /**
+ * Performs a binary xor on the passed in BitString
+ *
+ * @param value the BitString to xor against this one
+ * @return a new BitString of the combined values. Please
+ * note that the result will have the length of
+ * the largest BitString.
+ */
+ public BitString xor( BitString value ) {
+ BitString result = null;
+
+ int min = ((bits.length < value.bits.length) ? bits.length : value.bits.length);
+ int length = ((bits.length > value.bits.length) ? bits.length : value.bits.length);
+ int[] l_bits = new int[ length ];
+ java.util.Arrays.fill( l_bits, 0 );
+
+ for( int i = 0; i < min; i++ ) {
+ l_bits[i] = (bits[i] ^ value.bits[i]);
+ }
+
+ int l_numbits = getLength() > value.getLength() ? getLength() : value.getLength();
+ result = new BitString( l_bits, l_numbits );
+ return result;
+ }
+
+ /**
+ * Return the number of bits in this bit string
+ *
+ * @return an integer count of the number of bits
+ */
+ public int getLength() {
+ return numbits;
+ }
+
+ /**
+ * Method used to test the value of a specific bit
+ * @param i the index of the bit to test
+ * @return true if the bit is on, else false
+ */
+ public boolean isSet( int i ) {
+ boolean result = false;
+
+ // Calculate the byte offset
+ if( i >= numbits ) {
+ throw new IndexOutOfBoundsException();
+ }
+
+ // Calculate the offset to get the actual byte
+ int index = i / 32;
+ int bit = i % 32;
+
+ int aByte = (int)bits[index];
+ result = ((aByte & bitflags[bit]) != 0 );
+
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj) {
+ boolean result = false;
+
+ if( obj instanceof BitString ) {
+ if( obj == this ) {
+ result = true;
+ }
+ else {
+ BitString bObj = (BitString)obj;
+
+ if( bObj.getLength() == getLength() ) {
+ result = true;
+ for( int i = 0; result && i < getLength(); i++ ) {
+ result = (isSet( i ) == bObj.isSet(i));
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+
+ for( int i = numbits-1; i >= 0; i-- ) {
+ if( isSet(i) ) {
+ sb.append("1");
+ }
+ else {
+ sb.append("0");
+ }
+ }
+
+ return sb.toString();
+ }
+}