1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
package org.uic.barcode.ssbFrame;
import org.uic.barcode.asn1.uper.BitBuffer;
import org.uic.barcode.asn1.uper.ByteBitBuffer;
import org.uic.barcode.ticket.EncodingFormatException;
public class SsbStations {
/*
* Station code 1 bit 0 = Num; or 1=Bilateral AlphaNum 6Char
Numeric:
Station code List 4 bit 1= NRT; 2=Reservation
Departure station Location 28 bit
Arrival Station 28 bit
AlphaNum:
Departure: 30 bit
Arrival = 30 bit
*/
protected String arrivalStationCode = " ";
protected String departureStationCode = " ";
protected SsbStationCodeTable codeTable = SsbStationCodeTable.NRT;
public int encode(int offset, byte[] bytes) throws EncodingFormatException {
boolean isAlphaNumeric = false;
BitBuffer bits = new ByteBitBuffer(bytes);
try {
Integer.parseInt(arrivalStationCode);
Integer.parseInt(departureStationCode);
isAlphaNumeric = false;
} catch(NumberFormatException e) {
isAlphaNumeric = true;
}
bits.put(offset, isAlphaNumeric);
offset++;
if (isAlphaNumeric) {
if (departureStationCode.length() > 6) {
throw new EncodingFormatException("SSB departure station too long");
}
bits.putChar6String(offset,30, departureStationCode);
offset = offset + 30;
if (arrivalStationCode.length() > 6) {
throw new EncodingFormatException("SSB arrival station too long");
}
bits.putChar6String(offset,30, arrivalStationCode);
offset = offset + 30;
} else {
bits.putInteger(offset, 4, codeTable.ordinal());
offset = offset + 4;
int stationCode = Integer.parseInt(departureStationCode);
if (stationCode < 0 || stationCode > 9999999) {
throw new EncodingFormatException("SSB departure station code too long");
}
bits.putInteger(offset, 28, stationCode);
offset = offset + 28;
stationCode = Integer.parseInt(arrivalStationCode);
if (stationCode < 0 || stationCode > 9999999) {
throw new EncodingFormatException("SSB arrival station code too long");
}
bits.putInteger(offset, 28, stationCode);
offset = offset + 28;
}
return offset;
}
public int decode(int offset, byte[] bytes) {
BitBuffer bits = new ByteBitBuffer(bytes);
boolean isAlphaNumeric = bits.get(offset);
offset++;
if (isAlphaNumeric) {
departureStationCode = bits.getChar6String(offset,30);
offset = offset + 30;
arrivalStationCode = bits.getChar6String(offset,30);
offset = offset + 30;
} else {
codeTable = SsbStationCodeTable.values()[bits.getInteger(offset, 4)];
offset = offset + 4;
departureStationCode = Integer.toString(bits.getInteger(offset, 28));
offset = offset + 28;
arrivalStationCode = Integer.toString(bits.getInteger(offset, 28));
offset = offset + 28;
}
return offset;
}
public String getArrivalStationCode() {
return arrivalStationCode;
}
public void setArrivalStationCode(String arrivalStationCode) {
this.arrivalStationCode = arrivalStationCode;
}
public String getDepartureStationCode() {
return departureStationCode;
}
public void setDepartureStationCode(String departureStationCode) {
this.departureStationCode = departureStationCode;
}
public SsbStationCodeTable getCodeTable() {
return codeTable;
}
public void setCodeTable(SsbStationCodeTable codeTable) {
this.codeTable = codeTable;
}
}
|