/**********************************************************************************
*
* Copyright (c) 2003, 2004, 2007, 2008 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package edu.indiana.lib.twinpeaks.util;
import java.io.*;
import java.util.*;
/**
* Byte utilities
*/
public class ByteUtils
{
private static org.apache.commons.logging.Log _log = LogUtils.getLog(ByteUtils.class);
/*
* Byte manipulation utilities
*
* Private constructor
*/
private ByteUtils() { }
/**
* Returns the index in the source array where the first occurrence
* of the specified text (a String, converted to a byte array) is found
*
* @param source Byte array to examine
* @param matchString String to locate in <code>source</code>
* @return Index of the first matching character (-1 if no match)
*/
public static int indexOf(byte[] source, String matchString) {
return indexOf(source, matchString.getBytes());
}
/**
* Returns the index in the source array where the first occurrence
* of the specified byte pattern is found
*
* @param source Byte array to examine
* @param match Byte array to locate in <code>source</code>
* @return Index of the first matching character (-1 if no match)
*/
public static int indexOf(byte[] source, byte[] match) {
for (int i = 0; i < source.length; i++) {
if (startsWith(source, i, match)) {
return i;
}
}
return -1;
}
/**
* Returns the index in the source array where the last occurrence
* of the specified text (a String, converted to a byte array) is found
*
* @param source Byte array to examine
* @param matchString String to locate in <code>source</code>
* @return Index of the first matching character (-1 if no match)
*/
public static int lastIndexOf(byte[] source, String matchString) {
return lastIndexOf(source, matchString.getBytes());
}
/**
* Returns the index in the source array where the last occurrence
* of the specified byte pattern is found
*
* @param source Byte array to examine
* @param match Byte array to locate in <code>source</code>
* @return Index of the last matching character (-1 if no match)
*/
public static int lastIndexOf(byte[] source, byte[] match) {
if (source.length < match.length) {
return -1;
}
for (int i = (source.length - match.length); i >= 0; i--) {
if (startsWith(source, i, match)) {
return i;
}
}
return -1;
}
/**
* Does this byte array begin with match array content?
*
* @param source Byte array to examine
* @param match Byte array to locate in <code>source</code>
* @return true If the starting bytes are equal
*/
public static boolean startsWith(byte[] source, byte[] match) {
return startsWith(source, 0, match);
}
/**
* Does this byte array begin with match array content?
*
* @param source Byte array to examine
* @param offset An offset into the <code>source</code> array
* @param match Byte array to locate in <code>source</code>
* @return true If the starting bytes are equal
*/
public static boolean startsWith(byte[] source, int offset, byte[] match) {
if (match.length > (source.length - offset)) {
return false;
}
for (int i = 0; i < match.length; i++) {
if (source[offset + i] != match[i]) {
return false;
}
}
return true;
}
/**
* Does the source array equal the match array?
*
* @param source Byte array to examine
* @param offset An offset into the <code>source</code> array
* @param match Byte array to locate in <code>source</code>
* @return true If the two arrays are equal
*/
public static boolean equals(byte[] source, byte[] match) {
if (match.length != source.length) {
return false;
}
return startsWith(source, 0, match);
}
/**
* Copies bytes from the source byte array to the destination array
*
* @param source The source array
* @param srcBegin Index of the first source byte to copy
* @param srcEnd Index after the last source byte to copy
* @param destination The destination array
* @param dstBegin The starting offset in the destination array
*/
public static void getBytes(byte[] source, int srcBegin, int srcEnd,
byte[] destination, int dstBegin) {
System.arraycopy(source, srcBegin, destination, dstBegin, srcEnd - srcBegin);
}
/**
* Return a new byte array containing a sub-portion of the source array
*
* @param srcBegin The beginning index (inclusive)
* @param srcEnd The ending index (exclusive)
* @return The new, populated byte array
*/
public static byte[] subbytes(byte[] source, int srcBegin, int srcEnd) {
byte destination[];
destination = new byte[srcEnd - srcBegin];
getBytes(source, srcBegin, srcEnd, destination, 0);
return destination;
}
/**
* Return a new byte array containing a sub-portion of the source array
*
* @param srcBegin The beginning index (inclusive)
* @return The new, populated byte array
*/
public static byte[] subbytes(byte[] source, int srcBegin) {
return subbytes(source, srcBegin, source.length);
}
/*
* Test
*/
public static void main(String[] args) throws Exception {
byte byteText[];
int index, last;
byteText = args[0].getBytes();
index = indexOf(byteText, "XXX");
last = lastIndexOf(byteText, "XXX");
_log.debug("Index = " + index);
_log.debug("Last = " + last);
_log.debug("equal = " + equals(byteText, "XXX".getBytes()));
}
}