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 © 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日