1 package org.metricshub.ipmi.core.coding.rmcp;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import org.metricshub.ipmi.core.common.TypeConverter;
26
27
28
29
30 public final class RmcpDecoder {
31
32 private RmcpDecoder() {
33 }
34
35
36
37
38
39
40
41
42
43 public static RmcpMessage decode(byte[] rawMessage) {
44 RmcpMessage message = new RmcpMessage();
45
46 if (rawMessage.length < 4) {
47 throw new IllegalArgumentException("Message is corrupted");
48 }
49
50 message.setVersion(decodeVersion(rawMessage[0]));
51
52
53
54 message.setSequenceNumber(decodeSequenceNumber(rawMessage[2]));
55
56 message.setClassOfMessage(decodeClassOfMessage(rawMessage[3]));
57
58 message.setData(decodeData(rawMessage));
59
60 return message;
61 }
62
63 private static RmcpVersion decodeVersion(byte version) {
64 if (version == RmcpConstants.RMCP_V1_0) {
65 return RmcpVersion.RMCP1_0;
66 }
67
68 throw new IllegalArgumentException("Illegal RMCP version");
69 }
70
71 private static int decodeSequenceNumber(byte sequenceNumber) {
72 return TypeConverter.byteToInt(sequenceNumber);
73 }
74
75 private static RmcpClassOfMessage decodeClassOfMessage(byte classOfMessage) {
76 return RmcpClassOfMessage.parseInt(TypeConverter.byteToInt(classOfMessage) & 0x9f);
77
78 }
79
80 private static byte[] decodeData(byte[] rawMessage) {
81 byte[] data = new byte[rawMessage.length - 4];
82 System.arraycopy(rawMessage, 4, data, 0, data.length);
83 return data;
84 }
85
86 }