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

jlibs.core.lang.ByteSequence Maven / Gradle / Ivy

The newest version!
/**
 * Copyright 2015 Santhosh Kumar Tekuri
 *
 * The JLibs authors license this file to you under the Apache 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.apache.org/licenses/LICENSE-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 jlibs.core.lang;

import java.io.ByteArrayInputStream;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;

/**
 * This class represents a sequence of bytes.
 * 
 * @author Santhosh Kumar T
 */
public class ByteSequence implements Serializable{
    private byte buff[];
    private int offset;
    private int length;

    /**
     * Allocates a new {@code ByteSequence} so that it represents the sequence of
     * bytes currently contained in the byte array argument. The
     * contents of the byte array are not copied;
     *
     * @param buff value of the bytesequence
     */
    public ByteSequence(byte[] buff){
        set(buff, 0, buff.length);
    }

    /**
     * Allocates a new {@code ByteSequence} that contains characters from a subarray
     * of the byte array argument. The {@code offset} argument is the
     * index of the first byte of the subarray and the {@code length}
     * argument specifies the length of the subarray. The contents of the
     * subarray are not copied;
     *
     * @param  buff     Array that is the source of bytes
     * @param  offset   The initial offset
     * @param  length   The length
     *
     * @throws  IndexOutOfBoundsException
     *          If the {@code offset} and {@code length} arguments index
     *          bytes outside the bounds of the {@code buff} array
     */
    public ByteSequence(byte[] buff, int offset, int length){
        set(buff, offset, length);
    }

    /**
     * replaces the internal byte buffer with the given byte array.
     *
     * @param buff      Array that is the source of bytes
     * @param offset    The initial offset
     * @param length    The length
     */
    public void set(byte[] buff, int offset, int length){
        if(offset<0)
            throw new IndexOutOfBoundsException("ByteSequence index out of range: "+offset);
        if(length<0)
            throw new IndexOutOfBoundsException("ByteSequence index out of range: "+length);
        if(offset>buff.length-length)
            throw new StringIndexOutOfBoundsException("ByteSequence index out of range: "+(offset+length));

        this.buff = buff;
        this.offset = offset;
        this.length = length;
    }

    public byte byteAt(int index){
        if(index<0 || index>=length)
            throw new IndexOutOfBoundsException(index+" is not in range [0, "+length+")");
        else
            return buff[offset+index];
    }

    /** returns the byte buffer used by this instance */
    public byte[] buffer(){
        return buff;
    }

    /** returns the index of first byte in byte buffer*/
    public int offset(){
        return offset;
    }
    
    public int length(){
        return length;
    }

    public ByteSequence slice(int offset){
        return new ByteSequence(buff, this.offset+offset, length-offset);
    }

    public ByteSequence slice(int offset, int length){
        return new ByteSequence(buff, this.offset+offset, length);
    }

    public ByteBuffer toByteBuffer(){
        return ByteBuffer.wrap(buff, offset, length);
    }

    public byte[] toByteArray(boolean clone){
        if(!clone){
            if(offset==0 && buff.length==length)
                return buff;
        }
        byte array[] = new byte[length];
        System.arraycopy(buff, offset, array, 0, length);
        return array;
    }

    public ByteArrayInputStream asInputStream(){
        return new ByteArrayInputStream(buffer(), offset(), length());
    }

    public String toString(Charset charset){
        return new String(buff, offset, length, charset);
    }

    public String toString(String charset) throws UnsupportedEncodingException{
        return new String(buff, offset, length, charset);
    }

    @Override
    public String toString(){
        return new String(buff, offset, length);
    }

    public ByteSequence copy() {
        return new ByteSequence(toByteArray(true), 0, length);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy