diff --git a/core/java/src/net/i2p/data/UnsignedInteger.java b/core/java/src/net/i2p/data/UnsignedInteger.java index c29baa59bb810593537d12ca40f4c087e92e2457..c15a81416ea006a4bf682ea803e0adf2d6f0319e 100644 --- a/core/java/src/net/i2p/data/UnsignedInteger.java +++ b/core/java/src/net/i2p/data/UnsignedInteger.java @@ -74,8 +74,36 @@ public class UnsignedInteger { _log.error("Null data to be calculating for", new Exception("Argh")); return 0; } else if (data.length == 0) { return 0; } - BigInteger bi = new BigInteger(1, data); - return bi.longValue(); + long rv = 0; + for (int i = 0; i < data.length; i++) { + long cur = (long)(data[i]&0xFF); + if (cur < 0) cur = cur+256; + cur = (cur << (8*(data.length-i-1))); + rv += cur; + } + // only fire up this expensive assert if we're worried about it + if (_log.shouldLog(Log.DEBUG)) { + BigInteger bi = new BigInteger(1, data); + long biVal = bi.longValue(); + if (biVal != rv) { + _log.log(Log.CRIT, "ERR: " + bi.toString(2) + " /\t" + bi.toString(16) + " /\t" + bi.toString() + + " != \n " + Long.toBinaryString(rv) + " /\t" + Long.toHexString(rv) + + " /\t" + rv); + for (int i = 0; i < data.length; i++) { + long cur = (long)(data[i]&0xFF); + if (cur < 0) cur = cur+256; + long shiftBy = (8*(data.length-i-1)); + long old = cur; + cur = (cur << shiftBy); + _log.log(Log.CRIT, "cur["+ i+"]=" + Long.toHexString(cur) + " data = " + + Long.toHexString((data[i]&0xFF)) + " shiftBy: " + shiftBy + + " old: " + Long.toHexString(old)); + } + throw new RuntimeException("b0rked on " + bi.toString() + " / " + rv); + } + } + return rv; + } /** @@ -196,6 +224,7 @@ public class UnsignedInteger { } public static void main(String args[]) { + try { _log.debug("Testing 1024"); testNum(1024L); _log.debug("Testing 1025"); @@ -210,6 +239,7 @@ public class UnsignedInteger { testNum(1024 * 1024 * 1024 * 4L + 1L); _log.debug("Testing MaxLong"); testNum(Long.MAX_VALUE); + } catch (Throwable t) { t.printStackTrace(); } try { Thread.sleep(1000); } catch (Throwable t) {