FileDocCategorySizeDatePackage
BytePack.javaAPI DocphoneME MR2 API (J2ME)4123Wed May 02 18:00:30 BST 2007com.sun.midp.jsr82emul

BytePack.java

/*
 *   
 *
 * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation.
 * 
 * This program 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
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt).
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions.
 */
package com.sun.midp.jsr82emul;

/**
 * Utility class that packs various data to resores from byte array.
 * An instance refers to byte array that keeps packed data and passed 
 * to the instance thru either constructor or reset() method.
 */
public class BytePack {
    /** Current offset in byte array */
    protected int offset;
    /** Byte array that keeps packed data */
    protected byte[] buffer;
    
    /** 
     * Constructs an instance with given byte array. 
     * @param buffer byte array to either unpak data from or pack into.
     */
    public BytePack(byte[] buffer) {
        reset(buffer);
    }
    
    /** Constructs an instance. */
    public BytePack() {}
    
    /** 
     * Resets state, setting packed data destination to given array 
     * and current offset to 0. 
     * 
     * @param buffer new byte array to either unpak data from or pack into.
     */
    public void reset(byte[] buffer) {
        offset = 0;
        this.buffer = buffer;
    }
    
    /** Resets state, setting current offset to 0. */
    public void reset() {
        offset = 0;
    }
    
    /** 
     * Removes internal reference to current byte array, returning
     * the reference outside.
     * @return (reference to) byte array processed.
     */
    public byte[] release() {
        byte[] tmp = buffer;
        buffer = null;
        return tmp;
    }
    
    /**
     * Appends byte to packed data.
     * @param b byte to append.
     */
    public void append(byte b) {
        buffer[offset++] = b;
    }
    
    /**
     * Appends given bytes to packed data.
     * @param bytes bytes to append.
     */
    public void appendBytes(byte[] bytes) {
        System.arraycopy(bytes, 0, buffer, offset, bytes.length);
        offset += bytes.length;
    }
    
    /** 
     * Appends a 4-byte rpresentation of given integer value to packed data.
     * The value can be restored by extractInt() method.
     * @param value value to append
     */
    public void appendInt(int value) {
        for (int i = 0; i < 4; i++) {
            buffer[offset++] = (byte)value; 
            value >>= 8;
        }
    }
    
    /**
     * Extracts integer value previously stored by appendInt() from byte 
     * represnetation.
     * @return value extracted
     */
    public int extractInt() {
        int value = 0;
        for (int i = 0; i < 4; i++) {
            value |= (buffer[offset++] & 0xff) << (8 * i);
        }
        return value;
    }
    
    /**
     * Extracts next byte from packed data.
     * @return byte extracted.
     */
    public byte extract() {
        return buffer[offset++];
    }
    
    /**
     * Extracts next requested amount of bytes from packed data.
     * @param length amount of bytes to extract
     * @return (refernce to) newly created byte array that contains bytes
     *         extracted.
     */
    public byte[] extractBytes(int length) {
        byte[] bytes = new byte[length];
        System.arraycopy(buffer, offset, bytes, 0, length);
        offset += length;
        return bytes;
    }
}