1 // NAME 2 // $RCSfile: AsnUnsInteger.java,v $ 3 // DESCRIPTION 4 // [given below in javadoc format] 5 // DELTA 6 // $Revision: 3.16 $ 7 // CREATED 8 // $Date: 2006/01/17 17:43:54 $ 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 /** 71 * This class represents ASN.1 32-bit unsigned integer. It is used for 72 * TIMETICKS, COUNTER, GAUGE. 73 * 74 * @see SnmpConstants#TIMETICKS 75 * @see SnmpConstants#COUNTER 76 * @see SnmpConstants#GAUGE 77 * 78 * @author <a href="mailto:snmp@westhawk.co.uk">Tim Panton</a> 79 * @version $Revision: 3.16 $ $Date: 2006/01/17 17:43:54 $ 80 */ 81 public class AsnUnsInteger extends AsnObject { 82 private static final String version_id = "@(#)$Id: AsnUnsInteger.java,v 3.16 2006/01/17 17:43:54 birgit Exp $ Copyright Westhawk Ltd"; 83 84 /** 85 * The internal value of AsnUnsInteger. 86 */ 87 protected long value; 88 89 /** 90 * Constructor. The type of the AsnUnsInteger defaults to TIMETICKS. 91 * 92 * @param v The value of the AsnUnsInteger 93 * @see SnmpConstants#TIMETICKS 94 */ 95 public AsnUnsInteger(long v) { 96 this(v, TIMETICKS); 97 } 98 99 /** 100 * Constructor to create a specific type of AsnUnsInteger. 101 * 102 * @param v The value of the AsnUnsInteger 103 * @param t The type of the AsnUnsInteger 104 * @see SnmpConstants#TIMETICKS 105 * @see SnmpConstants#COUNTER 106 * @see SnmpConstants#GAUGE 107 */ 108 public AsnUnsInteger(long v, byte t) { 109 this.value = v; 110 this.type = t; 111 } 112 113 /** 114 * Constructor. 115 * 116 * @param in The input stream from which the value should be read 117 * @param len The length of the AsnUnsInteger 118 */ 119 public AsnUnsInteger(InputStream in, int len) throws IOException { 120 byte data[] = new byte[len]; 121 if (len != in.read(data, 0, len)) { 122 throw new IOException("AsnUnsInteger(): Not enough data"); 123 } 124 long val = bytesToLong(data); 125 this.value = val; 126 } 127 128 /** 129 * Returns the value representation of the AsnUnsInteger. 130 * 131 * @return The value of the AsnUnsInteger 132 */ 133 public long getValue() { 134 return value; 135 } 136 137 /** 138 * Returns the string representation of the AsnUnsInteger. 139 * 140 * @return The string of the AsnUnsInteger 141 */ 142 public String toString() { 143 return (String.valueOf(value)); 144 } 145 146 /** 147 * Returns the number of bytes the integer occupies. 148 */ 149 int size() { 150 int count, empty = 0x00, sign = 0x00; 151 152 if (value < 0) { 153 empty = 0xFF; 154 sign = 0x80; 155 } 156 157 // 32-bit integer.. change to 56 to write 64-bit long 158 // loop through bytes in value while it is 'empty' 159 for (count = 24; count > 0; count -= 8) { 160 if (((value >> count) & 0xFF) != empty) 161 break; 162 } 163 164 // Check sign bit.. make sure negative's MSB bit is 1, 165 // positives is 0 166 // (0x00000080 = 0x00 0x80) 0xFFFFFF01 => 0xFF 0x01 167 // (0x0000007F = 0x7F) 0xFFFFFF80 => 0x80 168 if (((value >> count) & 0x80) != sign) 169 count += 8; 170 return (count >> 3) + 1; 171 } 172 173 /** 174 * Output integer. 175 */ 176 void write(OutputStream out, int pos) throws IOException { 177 int count, empty = 0x00, sign = 0x00; 178 179 if (value < 0) { 180 empty = 0xFF; 181 sign = 0x80; 182 } 183 184 // Get count 185 for (count = 24; count > 0; count -= 8) { 186 if (((value >> count) & 0xFF) != empty) 187 break; 188 } 189 if (((value >> count) & 0x80) != sign) 190 count += 8; 191 192 // Build header and write value 193 AsnBuildHeader(out, type, (count >> 3) + 1); 194 195 if (debug > 10) { 196 System.out.println("\tAsnUnsInteger(): value = " + value 197 + ", pos = " + pos); 198 } 199 200 for (; count >= 0; count -= 8) { 201 out.write((byte) ((value >> count) & 0xFF)); 202 } 203 } 204 205 /** 206 * Changes an array of bytes into a long. 207 * Thanks to Julien Conan (jconan@protego.net) for improving 208 * this method. 209 * 210 * @param data the array of bytes 211 * @return the int representation of the array 212 */ 213 protected long bytesToLong(byte[] data) throws IOException { 214 DataInputStream dis = new DataInputStream( 215 new ByteArrayInputStream(data)); 216 217 long val = 0; 218 int size = data.length; 219 220 for (int n = 0; n < size; n++) { 221 val = (val << 8) + dis.readUnsignedByte(); 222 } 223 224 return val; 225 } 226 227 /** 228 * Compares this object to the specified object. The result is 229 * <code>true</code> if and only if the argument is not 230 * <code>null</code> and is an <code>AsnUnsInteger</code> object that 231 * contains the same <code>long</code> value as this object. 232 * 233 * @param obj the object to compare with. 234 * @return <code>true</code> if the objects are the same; 235 * <code>false</code> otherwise. 236 */ 237 public boolean equals(Object obj) { 238 if (obj instanceof AsnUnsInteger) { 239 return value == ((AsnUnsInteger) obj).value; 240 } 241 return false; 242 } 243 244 /** 245 * Returns a hash code for this <code>AsnUnsInteger</code>. 246 * 247 * @return a hash code value for this object, equal to the 248 * hash of the primitive <code>long</code> value represented 249 * by this <code>AsnUnsInteger</code> object. 250 */ 251 public int hashCode() { 252 // nicked from Long.hashCode 253 return (int) (value ^ (value >>> 32)); 254 } 255 }