package cn.org.hentai.jtt1078.util;
|
|
import java.util.Arrays;
|
|
/**
|
* Created by matrixy on 2018/4/14.
|
*/
|
public class Packet
|
{
|
int size = 0;
|
int offset = 0;
|
int maxSize = 0;
|
public byte[] data;
|
|
protected Packet()
|
{
|
// do nothing here..
|
}
|
|
public int size()
|
{
|
return size;
|
}
|
|
public void resizeTo(int size)
|
{
|
if (this.maxSize >= size) return;
|
byte[] old = Arrays.copyOf(this.data, this.offset);
|
this.data = new byte[size];
|
System.arraycopy(old, 0, this.data, 0, old.length);
|
}
|
|
/**
|
* 按指定的大小初始化一个数据包,一般大小为2 + 2 + 8 + 4 + DATA_LENGTH
|
*
|
* @param packetLength 数据包最大字节数
|
* @param bytes
|
* @return
|
*/
|
public static Packet create(int packetLength, byte[] bytes)
|
{
|
Packet p = new Packet();
|
p.data = new byte[packetLength];
|
p.maxSize = packetLength;
|
return p;
|
}
|
|
public static Packet create(int length)
|
{
|
Packet p = new Packet();
|
p.data = new byte[length];
|
p.maxSize = length;
|
p.size = 0;
|
p.offset = 0;
|
return p;
|
}
|
|
public static Packet create(byte[] data)
|
{
|
Packet p = new Packet();
|
p.data = data;
|
p.maxSize = data.length;
|
p.size = data.length;
|
p.offset = 0;
|
return p;
|
}
|
|
public Packet addByte(byte b)
|
{
|
this.data[size++] = b;
|
return this;
|
}
|
|
public Packet add3Bytes(int v)
|
{
|
this.data[size++] = (byte)((v >> 16) & 0xff);
|
this.data[size++] = (byte)((v >> 8) & 0xff);
|
this.data[size++] = (byte)((v >> 0) & 0xff);
|
return this;
|
}
|
|
// 如果b的值为0x7e,则自动转义
|
public Packet addByteAutoQuote(byte b)
|
{
|
if (b == 0x7e)
|
{
|
addByte((byte)0x7d);
|
addByte((byte)0x02);
|
}
|
else if (b == 0x7d)
|
{
|
addByte((byte)0x7d);
|
addByte((byte)0x01);
|
}
|
else
|
{
|
addByte(b);
|
}
|
return this;
|
}
|
|
public Packet putByte(byte b)
|
{
|
this.data[offset++] = b;
|
return this;
|
}
|
|
public Packet addShort(short s)
|
{
|
this.data[size++] = (byte) ((s >> 8) & 0xff);
|
this.data[size++] = (byte) (s & 0xff);
|
return this;
|
}
|
|
public Packet putShort(short s)
|
{
|
this.data[offset++] = (byte) ((s >> 8) & 0xff);
|
this.data[offset++] = (byte) (s & 0xff);
|
return this;
|
}
|
|
public Packet addInt(int i)
|
{
|
this.data[size++] = (byte) ((i >> 24) & 0xff);
|
this.data[size++] = (byte) ((i >> 16) & 0xff);
|
this.data[size++] = (byte) ((i >> 8) & 0xff);
|
this.data[size++] = (byte) (i & 0xff);
|
return this;
|
}
|
|
public Packet putInt(int i)
|
{
|
this.data[offset++] = (byte) ((i >> 24) & 0xff);
|
this.data[offset++] = (byte) ((i >> 16) & 0xff);
|
this.data[offset++] = (byte) ((i >> 8) & 0xff);
|
this.data[offset++] = (byte) (i & 0xff);
|
return this;
|
}
|
|
public Packet addLong(long l)
|
{
|
this.data[size++] = (byte) ((l >> 56) & 0xff);
|
this.data[size++] = (byte) ((l >> 48) & 0xff);
|
this.data[size++] = (byte) ((l >> 40) & 0xff);
|
this.data[size++] = (byte) ((l >> 32) & 0xff);
|
this.data[size++] = (byte) ((l >> 24) & 0xff);
|
this.data[size++] = (byte) ((l >> 16) & 0xff);
|
this.data[size++] = (byte) ((l >> 8) & 0xff);
|
this.data[size++] = (byte) (l & 0xff);
|
return this;
|
}
|
|
public Packet putLong(long l)
|
{
|
this.data[offset++] = (byte) ((l >> 56) & 0xff);
|
this.data[offset++] = (byte) ((l >> 48) & 0xff);
|
this.data[offset++] = (byte) ((l >> 40) & 0xff);
|
this.data[offset++] = (byte) ((l >> 32) & 0xff);
|
this.data[offset++] = (byte) ((l >> 24) & 0xff);
|
this.data[offset++] = (byte) ((l >> 16) & 0xff);
|
this.data[offset++] = (byte) ((l >> 8) & 0xff);
|
this.data[offset++] = (byte) (l & 0xff);
|
return this;
|
}
|
|
public Packet addBytes(byte[] b)
|
{
|
return addBytes(b, b.length);
|
}
|
|
public Packet addBytes(byte[] b, int len)
|
{
|
System.arraycopy(b, 0, this.data, size, len);
|
size += len;
|
return this;
|
}
|
|
public Packet putBytes(byte[] b)
|
{
|
System.arraycopy(b, 0, this.data, offset, b.length);
|
offset += b.length;
|
return this;
|
}
|
|
public Packet rewind()
|
{
|
this.offset = 0;
|
return this;
|
}
|
|
public byte nextByte()
|
{
|
return this.data[offset++];
|
}
|
|
public short nextShort()
|
{
|
return (short) (((this.data[offset++] & 0xff) << 8) | (this.data[offset++] & 0xff));
|
}
|
|
public short nextWord()
|
{
|
return nextShort();
|
}
|
|
public int nextDWord()
|
{
|
return nextInt();
|
}
|
|
public int nextInt()
|
{
|
return (this.data[offset++] & 0xff) << 24 | (this.data[offset++] & 0xff) << 16 | (this.data[offset++] & 0xff) << 8 | (this.data[offset++] & 0xff);
|
}
|
|
public String nextBCD()
|
{
|
byte val = this.data[offset++];
|
int ch1 = (val >> 4) & 0x0f;
|
int ch2 = (val & 0x0f);
|
return ch1 + "" + ch2;
|
}
|
|
public Packet addBCD(String num)
|
{
|
for (int i = 0, l = num.length(); i < l; i+=2)
|
{
|
char a = (char)(num.charAt(i) - '0');
|
char b = (char)(num.charAt(i + 1) - '0');
|
addByte((byte)(a << 4 | b));
|
}
|
return this;
|
}
|
|
public long nextLong()
|
{
|
return ((long) this.data[offset++] & 0xff) << 56 | ((long) this.data[offset++] & 0xff) << 48 | ((long) this.data[offset++] & 0xff) << 40 | ((long) this.data[offset++] & 0xff) << 32 | ((long) this.data[offset++] & 0xff) << 24 | ((long) this.data[offset++] & 0xff) << 16 | ((long) this.data[offset++] & 0xff) << 8 | ((long) this.data[offset++] & 0xff);
|
}
|
|
public byte[] nextBytes(int length)
|
{
|
byte[] buf = new byte[length];
|
System.arraycopy(this.data, offset, buf, 0, length);
|
offset += length;
|
return buf;
|
}
|
|
public byte[] nextBytes()
|
{
|
return nextBytes(size - offset);
|
}
|
|
public Packet skip(int offset)
|
{
|
this.offset += offset;
|
return this;
|
}
|
|
public Packet seek(int index)
|
{
|
this.offset = index;
|
return this;
|
}
|
|
public Packet reset()
|
{
|
this.offset = 0;
|
this.size = 0;
|
|
return this;
|
}
|
|
public byte[] getBytes()
|
{
|
if (size == maxSize) return this.data;
|
else
|
{
|
byte[] buff = new byte[size];
|
System.arraycopy(this.data, 0, buff, 0, size);
|
return buff;
|
}
|
}
|
|
public boolean hasMoreBytes()
|
{
|
return size - offset > 0;
|
}
|
|
public static void main(String[] args) throws Exception
|
{
|
ByteUtils.dump(Packet.create(32).addBCD("013800138000").getBytes());
|
}
|
}
|