diff --git a/apps/i2psnark/java/src/org/klomp/snark/bencode/BDecoder.java b/apps/i2psnark/java/src/org/klomp/snark/bencode/BDecoder.java
index 4f394d01e565073eeee0c229921419cef1884199..5076b7705117d94486bd4155bc26ef33d69c0664 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/bencode/BDecoder.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/bencode/BDecoder.java
@@ -221,46 +221,51 @@ public class BDecoder
       {
         c = read();
         if (c == 'e')
-          return new BEValue(BigInteger.ZERO);
+          return new BEValue(Integer.valueOf(0));
         else
           throw new InvalidBEncodingException("'e' expected after zero,"
                                               + " not '" + (char)c + "'");
       }
 
     // XXX - We don't support more the 255 char big integers
-    char[] chars = new char[256];
-    int off = 0;
+    StringBuilder chars = new StringBuilder(16);
 
     if (c == '-')
       {
         c = read();
         if (c == '0')
           throw new InvalidBEncodingException("Negative zero not allowed");
-        chars[off] = (char)c;
-        off++;
+        chars.append((char)c);
       }
 
     if (c < '1' || c > '9')
       throw new InvalidBEncodingException("Invalid Integer start '"
                                           + (char)c + "'");
-    chars[off] = (char)c;
-    off++;
+    chars.append((char)c);
 
     c = read();
-    int i = c - '0';
-    while(i >= 0 && i <= 9)
+    while(c >= '0' && c <= '9')
       {
-        chars[off] = (char)c;
-        off++;
+        chars.append((char)c);
         c = read();
-        i = c - '0';
       }
 
     if (c != 'e')
       throw new InvalidBEncodingException("Integer should end with 'e'");
 
-    String s = new String(chars, 0, off);
-    return new BEValue(new BigInteger(s));
+    String s = chars.toString();
+    int len = s.length();
+    // save a little space if we're sure it will fit
+    Number num;
+    if (len < 10)
+        num = Integer.valueOf(s);
+    else if (len < 19)
+        num = Long.valueOf(s);
+    else if (len > 256)
+        throw new InvalidBEncodingException("Too many digits: " + len);
+    else
+        num = new BigInteger(s);
+    return new BEValue(num);
   }
 
   /**