All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.snmp4j.smi.Counter64 Maven / Gradle / Ivy

/*_############################################################################
  _## 
  _##  SNMP4J 2 - Counter64.java  
  _## 
  _##  Copyright (C) 2003-2016  Frank Fock and Jochen Katz (SNMP4J.org)
  _##  
  _##  Licensed under the Apache License, Version 2.0 (the "License");
  _##  you may not use this file except in compliance with the License.
  _##  You may obtain a copy of the License at
  _##  
  _##      http://www.apache.org/licenses/LICENSE-2.0
  _##  
  _##  Unless required by applicable law or agreed to in writing, software
  _##  distributed under the License is distributed on an "AS IS" BASIS,
  _##  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  _##  See the License for the specific language governing permissions and
  _##  limitations under the License.
  _##  
  _##########################################################################*/

package org.snmp4j.smi;

import java.io.*;
import java.math.BigInteger;
import org.snmp4j.asn1.BER;
import org.snmp4j.asn1.BERInputStream;

/**
 * The Counter64 class represents a 64bit unsigned integer type.
 * It is used for monotonically increasing values that wrap around at
 * 2^64-1 (18446744073709551615).
 * 

* The unsigned 64bit value is represented by a signed 64bit long value * internally. * * @author Frank Fock * @version 1.8 */ public class Counter64 extends AbstractVariable implements AssignableFromLong, AssignableFromString { private static final long serialVersionUID = 8741539680564150071L; private long value = 0; public Counter64() { } public Counter64(long value) { setValue(value); } public void encodeBER(OutputStream outputStream) throws java.io.IOException { BER.encodeUnsignedInt64(outputStream, BER.COUNTER64, value); } public void decodeBER(BERInputStream inputStream) throws java.io.IOException { BER.MutableByte type = new BER.MutableByte(); long newValue = BER.decodeUnsignedInt64(inputStream, type); if (type.getValue() != BER.COUNTER64) { throw new IOException("Wrong type encountered when decoding Counter64: " + type.getValue()); } setValue(newValue); } public int getSyntax() { return SMIConstants.SYNTAX_COUNTER64; } public int hashCode() { return (int) value; } public int getBERLength() { if (value < 0L) { return 11; } if (value < 0x80000000L) { if (value < 0x8000L) { return (value < 0x80L) ? 3 : 4; } return (value < 0x800000L) ? 5 : 6; } if (value < 0x800000000000L) { return (value < 0x8000000000L) ? 7 : 8; } return (value < 0x80000000000000L) ? 9 : 10; } public boolean equals(Object o) { return (o instanceof Counter64) && ((Counter64) o).value == value; } public int compareTo(Variable o) { long other = ((Counter64) o).value; for (int i = 63; i >= 0; i--) { if (((value >> i) & 1) != ((other >> i) & 1)) { if (((value >> i) & 1) != 0) { return 1; } else { return -1; } } } return 0; } public String toString() { if ((value > 0) && (value < Long.MAX_VALUE)) { return Long.toString(value); } byte[] bytes = new byte[8]; for (int i = 0; i < 8; i++) { bytes[i] = (byte) ((value >> ((7 - i) * 8)) & 0xFF); } BigInteger i64 = new BigInteger(1, bytes); return i64.toString(); } public void setValue(String value) { this.value = Long.parseLong(value); } public void setValue(long value) { this.value = value; } public long getValue() { return value; } public Object clone() { return new Counter64(value); } /** * Increment the value of the counter by one. If the current value is * 2^63-1 (9223372036854775807) then value will be set to -2^63. Nevertheless, * the BER encoded value of this counter will always be unsigned! */ public void increment() { value++; } /** * Increment the value by more than one in one step. * @param increment * an increment value greater than zero. * @return * the current value of the counter. * @since 2.4.2 */ public long increment(long increment) { if (increment < 0) { throw new IllegalArgumentException("Counter64 allows only positive increments: "+increment); } return this.value += increment; } public final int toInt() { return (int)getValue(); } public final long toLong() { return getValue(); } public OID toSubIndex(boolean impliedLength) { throw new UnsupportedOperationException(); } public void fromSubIndex(OID subIndex, boolean impliedLength) { throw new UnsupportedOperationException(); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy