UartBus source documentation
PacketReader.java
1 package eu.javaexperience.electronic.uartbus;
2 
3 import java.math.BigInteger;
4 import java.util.Arrays;
5 
6 public class PacketReader
7 {
8  protected byte[] data;
9  protected int ep = 0;
10 
11  public PacketReader(byte[] data)
12  {
13  this.data = data;
14  }
15 
16  public PacketReader(byte[] data, int ep)
17  {
18  this(data);
19  this.ep = ep;
20  }
21 
22  public int getParseStateIndex()
23  {
24  return ep;
25  }
26 
27  public void setParseStateIndex(int index)
28  {
29  ep = index;
30  }
31 
32  public int getRemainingBytes()
33  {
34  return data.length-ep;
35  }
36 
37  public byte readSByte()
38  {
39  return data[ep++];
40  }
41 
42  public short readUByte()
43  {
44  return (short) (0xff & data[ep++]);
45  }
46 
47  public long readVuint()
48  {
49  return readInt(false).longValue();
50  }
51 
52  public long readVsint()
53  {
54  return readInt(true).longValue();
55  }
56 
57  public BigInteger readInt(boolean signed)
58  {
59  int[] u = new int[1];
60  BigInteger ret = UartbusTools.unpackValue(signed, data, ep, u);
61  ep += u[0];
62  return ret;
63  }
64 
65  public byte[] readBlob(int length)
66  {
67  byte[] ret = Arrays.copyOfRange(data, ep, ep+length);
68  ep += length;
69  return ret;
70  }
71 
72  public byte[] readBlobRemain()
73  {
74  return readBlob(data.length-ep);
75  }
76 
77  public String readString()
78  {
79  for(int i=0;i<data.length-ep;++i)
80  {
81  if(0 == data[ep+i])
82  {
83  return new String(readBlob(i));
84  }
85  }
86 
87  throw new RuntimeException("No string in the buffer");
88  }
89 
90  public short readSShort()
91  {
92  short ret = 0;
93  ret |= ((short) data[ep]) << 8;
94  ret |= (data[ep+1] & 0xff);
95  ep += 2;
96  return ret;
97  }
98 
99  public int readSInt()
100  {
101  int ret = 0;
102  ret |= ((int) data[ep]) << 24;
103  ret |= ((int) data[ep+1]) << 16;
104  ret |= ((int) data[ep+2]) << 8;
105  ret |= data[ep+3] & 0xff;
106  ep += 4;
107  return ret;
108  }
109 
110  public long readSLong()
111  {
112  long ret = 0;
113  ret |= ((long) data[ep]) << 56;
114  ret |= ((long) data[ep+1]) << 48;
115  ret |= ((long) data[ep+2]) << 40;
116  ret |= ((long) data[ep+3]) << 32;
117  ret |= ((long) data[ep+4]) << 24;
118  ret |= ((long) data[ep+5]) << 16;
119  ret |= ((long) data[ep+6]) << 8;
120  ret |= data[ep+7] & 0xff;
121  ep += 8;
122  return ret;
123  }
124 
125  public float readFloat()
126  {
127  return Float.intBitsToFloat(readSInt());
128  }
129 
130  public double readDouble()
131  {
132  return Double.longBitsToDouble(readSLong());
133  }
134 
135  public BigInteger readVsNumber()
136  {
137  return readInt(true);
138  }
139 
140  public BigInteger readVuNumber()
141  {
142  return readInt(false);
143  }
144 
145  public int readUShort()
146  {
147  int ret = 0;
148  ret |= ((int) data[ep]) << 8;
149  ret |= data[ep+1] & 0xff;
150  ep += 2;
151  return ret;
152  }
153 
154  public boolean hasUnprocessedBytes()
155  {
156  return ep < data.length;
157  }
158 }