1 // NAME
2 // $RCSfile: AsnInteger.java,v $
3 // DESCRIPTION
4 // [given below in javadoc format]
5 // DELTA
6 // $Revision: 3.14 $
7 // CREATED
8 // $Date: 2008/05/27 15:40:14 $
9 // COPYRIGHT
10 // Westhawk Ltd
11 // TO DO
12 //
13
14 /*
15 * Copyright (C) 1995, 1996 by West Consulting BV
16 *
17 * Permission to use, copy, modify, and distribute this software
18 * for any purpose and without fee is hereby granted, provided
19 * that the above copyright notices appear in all copies and that
20 * both the copyright notice and this permission notice appear in
21 * supporting documentation.
22 * This software is provided "as is" without express or implied
23 * warranty.
24 * author <a href="mailto:snmp@westhawk.co.uk">Tim Panton</a>
25 * original version by hargrave@dellgate.us.dell.com (Jordan Hargrave)
26 */
27
28 /*
29 * Copyright (C) 1996 - 2006 by Westhawk Ltd
30 * <a href="www.westhawk.co.uk">www.westhawk.co.uk</a>
31 *
32 * Permission to use, copy, modify, and distribute this software
33 * for any purpose and without fee is hereby granted, provided
34 * that the above copyright notices appear in all copies and that
35 * both the copyright notice and this permission notice appear in
36 * supporting documentation.
37 * This software is provided "as is" without express or implied
38 * warranty.
39 * author <a href="mailto:snmp@westhawk.co.uk">Tim Panton</a>
40 */
41
42 package uk.co.westhawk.snmp.stack;
43
44 /*-
45 * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲
46 * SNMP Java Client
47 * ჻჻჻჻჻჻
48 * Copyright 2023 MetricsHub, Westhawk
49 * ჻჻჻჻჻჻
50 * This program is free software: you can redistribute it and/or modify
51 * it under the terms of the GNU Lesser General Public License as
52 * published by the Free Software Foundation, either version 3 of the
53 * License, or (at your option) any later version.
54 *
55 * This program is distributed in the hope that it will be useful,
56 * but WITHOUT ANY WARRANTY; without even the implied warranty of
57 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
58 * GNU General Lesser Public License for more details.
59 *
60 * You should have received a copy of the GNU General Lesser Public
61 * License along with this program. If not, see
62 * <http://www.gnu.org/licenses/lgpl-3.0.html>.
63 * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱
64 */
65
66 import java.io.*;
67 import java.util.*;
68
69 /**
70 * This class represents the ASN.1 32-bit signed integer
71 *
72 * @see SnmpConstants#ASN_INTEGER
73 *
74 * @author <a href="mailto:snmp@westhawk.co.uk">Tim Panton</a>
75 * @version $Revision: 3.14 $ $Date: 2008/05/27 15:40:14 $
76 */
77 public class AsnInteger extends AsnObject {
78 private static final String version_id = "@(#)$Id: AsnInteger.java,v 3.14 2008/05/27 15:40:14 birgita Exp $ Copyright Westhawk Ltd";
79
80 /**
81 * The internal value of AsnInteger.
82 */
83 protected int value;
84
85 /**
86 * Constructor.
87 *
88 * @param v The value of the AsnInteger
89 */
90 public AsnInteger(int v) {
91 value = v;
92 type = ASN_INTEGER;
93 }
94
95 /**
96 * Constructor.
97 *
98 * @param in The input stream from which the value should be read
99 * @param len The length of the AsnInteger
100 */
101 public AsnInteger(InputStream in, int len) throws IOException {
102 byte data[] = new byte[len];
103 if (len != in.read(data, 0, len)) {
104 throw new IOException("AsnInteger(): Not enough data");
105 }
106 int val = bytesToInteger(data);
107 value = val;
108 }
109
110 /**
111 * Returns the value.
112 *
113 * @return The value of the AsnInteger
114 */
115 public int getValue() {
116 return value;
117 }
118
119 /**
120 * Returns the string representation of the AsnInteger.
121 *
122 * @return The string of the AsnInteger
123 */
124 public String toString() {
125 return (String.valueOf(value));
126 }
127
128 /**
129 * Returns the number of bytes the integer occupies.
130 */
131 int size() {
132 int count, empty = 0x00, sign = 0x00;
133
134 if (value < 0) {
135 empty = 0xFF;
136 sign = 0x80;
137 }
138
139 // 32-bit integer.. change to 56 to write 64-bit long
140 // loop through bytes in value while it is 'empty'
141 for (count = 24; count > 0; count -= 8) {
142 if (((value >> count) & 0xFF) != empty)
143 break;
144 }
145 // Check sign bit.. make sure negative's MSB bit is 1,
146 // positives is 0
147 // (0x00000080 = 0x00 0x80) 0xFFFFFF01 => 0xFF 0x01
148 // (0x0000007F = 0x7F) 0xFFFFFF80 => 0x80
149 if (((value >> count) & 0x80) != sign)
150 count += 8;
151 return (count >> 3) + 1;
152 }
153
154 /**
155 * Output integer.
156 */
157 void write(OutputStream out, int pos) throws IOException {
158 int count, empty = 0x00, sign = 0x00;
159
160 if (value < 0) {
161 empty = 0xFF;
162 sign = 0x80;
163 }
164
165 // Get count
166 for (count = 24; count > 0; count -= 8) {
167 if (((value >> count) & 0xFF) != empty)
168 break;
169 }
170 if (((value >> count) & 0x80) != sign)
171 count += 8;
172
173 // Build header and write value
174 AsnBuildHeader(out, ASN_INTEGER, (count >> 3) + 1);
175
176 if (debug > 10) {
177 System.out.println("\tAsnInteger(): value = " + value
178 + ", pos = " + pos);
179 }
180
181 for (; count >= 0; count -= 8) {
182 out.write((byte) ((value >> count) & 0xFF));
183 }
184 }
185
186 /**
187 * Changes an array of bytes into an int.
188 * Thanks to Julien Conan (jconan@protego.net) for improving
189 * this method.
190 *
191 * @param data the array of bytes
192 * @return the int representation of the array
193 */
194 protected int bytesToInteger(byte[] data) throws IOException {
195 DataInputStream dis = new DataInputStream(
196 new ByteArrayInputStream(data));
197
198 int val = 0;
199 int size = data.length;
200
201 /*
202 * First byte contains the sign if the number is negative. Do this
203 * only for AsnInteger
204 */
205 val = dis.readByte();
206
207 for (int n = 1; n < size; n++) {
208 val = (val << 8) + dis.readUnsignedByte();
209 }
210
211 return val;
212 }
213
214 /**
215 * Compares this object to the specified object. The result is
216 * <code>true</code> if and only if the argument is not
217 * <code>null</code> and is an <code>AsnInteger</code> object that
218 * contains the same <code>int</code> value as this object.
219 *
220 * @param obj the object to compare with.
221 * @return <code>true</code> if the objects are the same;
222 * <code>false</code> otherwise.
223 */
224 public boolean equals(Object obj) {
225 if (obj instanceof AsnInteger) {
226 return value == ((AsnInteger) obj).value;
227 }
228 return false;
229 }
230
231 /**
232 * Returns a hash code for this <code>AsnInteger</code>.
233 *
234 * @return a hash code value for this object, equal to the
235 * primitive <code>int</code> value represented by this
236 * <code>AsnInteger</code> object.
237 */
238 public int hashCode() {
239 return value;
240 }
241 }