[SNMP4J] More Info About Counter64 Bug

Frank Fock fock at agentpp.com
Sat Aug 6 14:00:16 CEST 2005


Hi Jim,

Thanks for the fix. The last proposed code snippet will be in release 1.6.

Best regards,
Frank

Jim Doble wrote:

>I've been testing one of the proposed fixes to the problem in the
>getBERLength method in the Counter64 class, and noticed that the code I
>proposed needs a modification to handle the case where the Java will treat
>the long value as negative (because a 64 bit unsigned value is being
>represented as a Java long, which is a 64 bit signed value. The modified
>code is:
>
>public int getBERLength() {
>  if (value < 0L) {
>    return 11;
>  }
>  if (value < 0x80L) {
>    return 3;
>  }
>  if (value < 0x8000L) {
>    return 4;
>  }
>  if (value < 0x800000L) {
>    return 5;
>  }
>  if (value < 0x80000000L) {
>    return 6;
>  }
>  if (value < 0x8000000000L) {
>    return 7;
>  }
>  if (value < 0x800000000000L) {
>    return 8;
>  }
>  if (value < 0x80000000000000L) {
>    return 9;
>  }
>  return 10;
>}
>
>A similar approach, which looks a little more complicated but might be
>faster if the values are uniformly distributed across the entire range of
>possible values is to essentially perform the equivalent of a binary search:
>
>public int getBERLength() {
>  if (value < 0L) {
>    return 11;
>  }
>  if (value < 0x80000000L) {
>    if (value < 0x8000L) {
>	if (value < 0x80L) {
>	  return 3;
>	}
>      else {
>	  return 4;
>	}
>    }
>    else {
>	if (value < 0x800000L) {
>	  return 5;
>	}
>      else {
>	  return 6;
>	}
>    }
>  }
>  else {
>    if (value < 0x800000000000L) {
>	if (value < 0x8000000000L) {
>	  return 7;
>	}
>      else {
>	  return 8;
>	}
>    }
>    else {
>	if (value < 0x80000000000000L) {
>	  return 9;
>	}
>      else {
>	  return 10;
>	}
>    }
>  }
>}
>
>If there is a preference for more concise code, the same logic can be
>expressed as:
>
>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;
>}
>
>
>_______________________________________________
>SNMP4J mailing list
>SNMP4J at agentpp.org
>http://lists.agentpp.org/mailman/listinfo/snmp4j
>
>
>  
>


-- 
AGENT++
http://www.agentpp.com
http://www.mibexplorer.com
http://www.mibdesigner.com





More information about the SNMP4J mailing list