首页>代码>java编写的音乐播放器yoyoplayer程序代码,界面很炫>/YOYOPlayer/src/com/ctreber/aclib/codec/AbstractDecoder.java
package com.ctreber.aclib.codec;

import java.io.IOException;

/**
 * <p>
 * Byte stream decoder for 1, 2, and 4 byte values in big or little endian
 * format.
 * </p>
 * @author &copy; Christian Treber, ct@ctreber.com
 */
public abstract class AbstractDecoder {
    /** Highest order byte comes first. */
    public static final int BIG_ENDIAN = 0;

    /** Lowest order byte comes first. */
    public static final int LITTLE_ENDIAN = 1;

    /** Determines the byte order in multi byte values. */
    private int _endianness = BIG_ENDIAN;

    protected long _pos;

    /** Static buffer to read values w/o allocating an array every time. */
    private final byte[] _readBuf = new byte[4];

    /**
     * @return A one byte value (aka BYTE, unsigned char)
     * @throws java.io.IOException
     */
    public short readUInt1() throws IOException {
        return (short) readValue(1);
    }

    /**
     * @return A two byte value (aka WORD, unsigned short)
     * @throws java.io.IOException
     */
    public int readUInt2() throws IOException {
        return (int) readValue(2);
    }

    /**
     * @return A four byte value (aka DWORD, unsigned long).
     * @throws java.io.IOException
     */
    public long readUInt4() throws IOException {
        return readValue(4);
    }

    /**
     * @param pEndianess
     *            The byte order
     * @see #BIG_ENDIAN
     * @see #LITTLE_ENDIAN
     */
    public void setEndianess(final int pEndianess) {
        _endianness = pEndianess;
    }

    /**
     * @return Current position in file
     */
    public long getPos() {
        return _pos;
    }

    /**
     * @param pPos
     *            Position to advance to. Nothing will happen if the position
     *            has already been passed.
     * @throws java.io.IOException
     */
    public abstract void seek(long pPos) throws IOException;

    /**
     * Implemented by a specific decoder.
     * @param pBytes
     *            Bytes to read
     * @param pBuffer
     *            The buffer to write the read bytes to. If null, a buffer is
     *            reserved.
     * @return Array with the bytes read.
     * @throws java.io.IOException
     */
    public abstract byte[] readBytes(long pBytes, byte[] pBuffer)
            throws IOException;

    protected long readValue(final int pBytes) throws IOException {
        readBytes(pBytes, _readBuf);
        if (pBytes == 1) {
            // Shortcut: endianness plays no role here.
            return _readBuf[0] & 0xFF;
        }

        long lValue = 0;
        if (_endianness == BIG_ENDIAN) {
            for (int lByteNo = 0; lByteNo < pBytes; lByteNo++) {
                lValue <<= 8;
                lValue += _readBuf[lByteNo] & 0xff;
            }
        } else {
            for (int lByteNo = pBytes - 1; lByteNo >= 0; lByteNo--) {
                lValue <<= 8;
                lValue += _readBuf[lByteNo] & 0xff;
            }
        }

        return lValue;
    }

    /**
     * Call when done with decoder.
     * @throws IOException
     */
    public abstract void close() throws IOException;
}
最近下载更多
lzl111213  LV1 2023年6月21日
wyx065747  LV67 2022年5月7日
微信网友_5852742079762432  LV6 2022年4月11日
一个好人520  LV10 2021年9月29日
wangdongtai  LV31 2021年8月2日
yxcker  LV7 2021年7月9日
时光凉薄  LV2 2021年7月9日
Mayoubin2001  LV21 2021年6月10日
adim10912  LV2 2020年12月27日
Demo1111  LV30 2020年12月25日
最近浏览更多
花朝廿五  LV1 6月10日
于子洲  LV1 6月2日
JulyMagnolia  LV4 4月29日
cxz2132132  LV11 2023年12月9日
pangzhihui  LV14 2023年11月13日
543539666  LV7 2023年8月30日
NicLee 2023年7月7日
暂无贡献等级
lzl111213  LV1 2023年6月21日
cmq258159  LV2 2023年6月20日
数据库1  LV12 2023年5月17日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友