Class BDecoder


  • public class BDecoder
    extends java.lang.Object
    A set of utility methods to decode a bencoded array of byte into a Map. integer are represented as Long, String as byte[], dictionnaries as Map, and list as List.
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
        BDecoder()
      Create a BDecoder using BYTE_ENCODING_CHARSET (ISO_8859_1)
        BDecoder​(java.nio.charset.Charset keyCharset)
      Create a BDecoder using specified charset.
      private BDecoder​(java.nio.charset.Charset keyCharset, boolean useNewDecoder)  
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      static java.util.Map<java.lang.String,​java.lang.Object> decode​(byte[] data)  
      static java.util.Map<java.lang.String,​java.lang.Object> decode​(byte[] data, int offset, int length)  
      static java.util.Map<java.lang.String,​java.lang.Object> decode​(java.io.BufferedInputStream is)  
      private java.util.Map<java.lang.String,​java.lang.Object> decode​(java.io.InputStream data, boolean internKeys)  
      java.util.Map<java.lang.String,​java.lang.Object> decodeByteArray​(byte[] data)  
      java.util.Map<java.lang.String,​java.lang.Object> decodeByteArray​(byte[] data, int offset, int length)  
      java.util.Map<java.lang.String,​java.lang.Object> decodeByteArray​(byte[] data, int offset, int length, boolean internKeys)  
      java.util.Map<java.lang.String,​java.lang.Object> decodeByteBuffer​(java.nio.ByteBuffer buffer, boolean internKeys)  
      static java.util.Map decodeFromJSON​(java.lang.String json)  
      static java.util.List decodeFromJSONArray​(java.util.List j_list)  
      private static java.lang.Object decodeFromJSONGeneric​(java.lang.Object obj)  
      static java.util.Map decodeFromJSONObject​(java.util.Map<java.lang.Object,​java.lang.Object> j_map)  
      private java.lang.Object decodeInputStream​(java.io.InputStream dbis, java.lang.String context, int nesting, boolean internKeys)  
      private java.lang.Object decodeInputStream2​(java.io.InputStream dbis, java.lang.String context, int nesting, boolean internKeys)
      Differences between decodeInputStream
      This: Uses byte[] for keys
      Other: Uses ByteBuffer

      This: Uses new String(byte[], pos, len, charset)
      Other: Uses CharsetDecoder.decode(ByteBuffer, CharBuffer) and new String(charBuffer.array(), 0, len)

      This: Verifies map order using key in String form
      Other: Verifies map order by copying bytes and comparing
      java.util.Map<java.lang.String,​java.lang.Object> decodeStream​(java.io.BufferedInputStream data)  
      java.util.Map<java.lang.String,​java.lang.Object> decodeStream​(java.io.BufferedInputStream data, boolean internKeys)  
      static java.util.List decodeStrings​(java.util.List list)
      Decodes byte arrays into strings.
      static java.util.Map decodeStrings​(java.util.Map map)
      Converts any byte[] entries into UTF-8 strings.
      private void getByteArrayFromStream​(java.io.InputStream dbis, int length, byte[] targetArray)  
      private byte[] getByteArrayFromStream​(java.io.InputStream dbis, java.lang.String context)  
      BDecoder.MapDecodeListener getMapDecodeListener()  
      private long getNumberFromStream​(java.io.InputStream dbis, char parseChar)  
      private int getPositiveNumberFromStream​(java.io.InputStream dbis, char parseChar)  
      static void main​(java.lang.String[] args)  
      static long parseLong​(char[] chars, int start, int length)  
      private static void print​(java.io.File f, java.io.File output)  
      static void print​(java.io.PrintWriter writer, java.lang.Object obj)  
      private static void print​(java.io.PrintWriter writer, java.lang.Object obj, java.lang.String indent, boolean skip_indent)  
      static void print​(java.lang.Object obj)  
      void setMapDecodeListener​(BDecoder.MapDecodeListener mapDecodeListener)  
      void setRecoveryMode​(boolean r)  
      void setVerifyMapOrder​(boolean b)  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • NEWDECODER_FOR_DEF_CHARSET

        private static final boolean NEWDECODER_FOR_DEF_CHARSET
      • PORTABLE_ROOT

        private static final byte[] PORTABLE_ROOT
      • recovery_mode

        private boolean recovery_mode
      • verify_map_order

        private boolean verify_map_order
      • useNewDecoder

        private boolean useNewDecoder
      • keyDecoder

        private final java.nio.charset.CharsetDecoder keyDecoder
      • keyCharset

        private final java.nio.charset.Charset keyCharset
      • keyDecoderUTF8

        private java.nio.charset.CharsetDecoder keyDecoderUTF8
      • keyCharsetUTF8

        private java.nio.charset.Charset keyCharsetUTF8
      • keyBytesLen

        private int keyBytesLen
      • keyBytesBuffer

        private java.nio.ByteBuffer keyBytesBuffer
      • keyBytes

        private byte[] keyBytes
      • keyCharsBuffer

        private java.nio.CharBuffer keyCharsBuffer
      • force_utf8_keys

        private boolean force_utf8_keys
      • numberChars

        private final char[] numberChars
        only create the array once per decoder instance (no issues with recursion as it's only used in a leaf method)
    • Constructor Detail

      • BDecoder

        public BDecoder()
        Create a BDecoder using BYTE_ENCODING_CHARSET (ISO_8859_1)
      • BDecoder

        public BDecoder​(java.nio.charset.Charset keyCharset)
        Create a BDecoder using specified charset.

        New decoder will be used, which can handle UTF-8 properly

      • BDecoder

        private BDecoder​(java.nio.charset.Charset keyCharset,
                         boolean useNewDecoder)
    • Method Detail

      • decode

        public static java.util.Map<java.lang.String,​java.lang.Object> decode​(byte[] data)
                                                                             throws java.io.IOException
        Throws:
        java.io.IOException
      • decode

        public static java.util.Map<java.lang.String,​java.lang.Object> decode​(byte[] data,
                                                                                    int offset,
                                                                                    int length)
                                                                             throws java.io.IOException
        Throws:
        java.io.IOException
      • decode

        public static java.util.Map<java.lang.String,​java.lang.Object> decode​(java.io.BufferedInputStream is)
                                                                             throws java.io.IOException
        Throws:
        java.io.IOException
      • decodeByteArray

        public java.util.Map<java.lang.String,​java.lang.Object> decodeByteArray​(byte[] data)
                                                                               throws java.io.IOException
        Throws:
        java.io.IOException
      • decodeByteArray

        public java.util.Map<java.lang.String,​java.lang.Object> decodeByteArray​(byte[] data,
                                                                                      int offset,
                                                                                      int length)
                                                                               throws java.io.IOException
        Throws:
        java.io.IOException
      • decodeByteArray

        public java.util.Map<java.lang.String,​java.lang.Object> decodeByteArray​(byte[] data,
                                                                                      int offset,
                                                                                      int length,
                                                                                      boolean internKeys)
                                                                               throws java.io.IOException
        Throws:
        java.io.IOException
      • decodeByteBuffer

        public java.util.Map<java.lang.String,​java.lang.Object> decodeByteBuffer​(java.nio.ByteBuffer buffer,
                                                                                       boolean internKeys)
                                                                                throws java.io.IOException
        Throws:
        java.io.IOException
      • decodeStream

        public java.util.Map<java.lang.String,​java.lang.Object> decodeStream​(java.io.BufferedInputStream data)
                                                                            throws java.io.IOException
        Throws:
        java.io.IOException
      • decodeStream

        public java.util.Map<java.lang.String,​java.lang.Object> decodeStream​(java.io.BufferedInputStream data,
                                                                                   boolean internKeys)
                                                                            throws java.io.IOException
        Throws:
        java.io.IOException
      • decode

        private java.util.Map<java.lang.String,​java.lang.Object> decode​(java.io.InputStream data,
                                                                              boolean internKeys)
                                                                       throws java.io.IOException
        Throws:
        java.io.IOException
      • decodeInputStream

        private java.lang.Object decodeInputStream​(java.io.InputStream dbis,
                                                   java.lang.String context,
                                                   int nesting,
                                                   boolean internKeys)
                                            throws java.io.IOException
        Throws:
        java.io.IOException
      • decodeInputStream2

        private java.lang.Object decodeInputStream2​(java.io.InputStream dbis,
                                                    java.lang.String context,
                                                    int nesting,
                                                    boolean internKeys)
                                             throws java.io.IOException
        Differences between decodeInputStream
        This: Uses byte[] for keys
        Other: Uses ByteBuffer

        This: Uses new String(byte[], pos, len, charset)
        Other: Uses CharsetDecoder.decode(ByteBuffer, CharBuffer) and new String(charBuffer.array(), 0, len)

        This: Verifies map order using key in String form
        Other: Verifies map order by copying bytes and comparing

        On a torrent with 100k files and set to verify map order, this method is 2.5x faster.

        Throws:
        java.io.IOException
      • getPositiveNumberFromStream

        private int getPositiveNumberFromStream​(java.io.InputStream dbis,
                                                char parseChar)
                                         throws java.io.IOException
        Throws:
        java.io.IOException
      • getNumberFromStream

        private long getNumberFromStream​(java.io.InputStream dbis,
                                         char parseChar)
                                  throws java.io.IOException
        Throws:
        java.io.IOException
      • parseLong

        public static long parseLong​(char[] chars,
                                     int start,
                                     int length)
      • getByteArrayFromStream

        private byte[] getByteArrayFromStream​(java.io.InputStream dbis,
                                              java.lang.String context)
                                       throws java.io.IOException
        Throws:
        java.io.IOException
      • getByteArrayFromStream

        private void getByteArrayFromStream​(java.io.InputStream dbis,
                                            int length,
                                            byte[] targetArray)
                                     throws java.io.IOException
        Throws:
        java.io.IOException
      • setVerifyMapOrder

        public void setVerifyMapOrder​(boolean b)
      • setRecoveryMode

        public void setRecoveryMode​(boolean r)
      • print

        public static void print​(java.lang.Object obj)
      • print

        public static void print​(java.io.PrintWriter writer,
                                 java.lang.Object obj)
      • print

        private static void print​(java.io.PrintWriter writer,
                                  java.lang.Object obj,
                                  java.lang.String indent,
                                  boolean skip_indent)
      • decodeStrings

        public static java.util.Map decodeStrings​(java.util.Map map)
        Converts any byte[] entries into UTF-8 strings. REPLACES EXISTING MAP VALUES
        Parameters:
        map -
        Returns:
      • decodeStrings

        public static java.util.List decodeStrings​(java.util.List list)
        Decodes byte arrays into strings. REPLACES EXISTING LIST VALUES
        Parameters:
        list -
        Returns:
        the same list passed in
      • print

        private static void print​(java.io.File f,
                                  java.io.File output)
      • decodeFromJSONGeneric

        private static java.lang.Object decodeFromJSONGeneric​(java.lang.Object obj)
      • decodeFromJSONArray

        public static java.util.List decodeFromJSONArray​(java.util.List j_list)
      • decodeFromJSONObject

        public static java.util.Map decodeFromJSONObject​(java.util.Map<java.lang.Object,​java.lang.Object> j_map)
      • decodeFromJSON

        public static java.util.Map decodeFromJSON​(java.lang.String json)
      • main

        public static void main​(java.lang.String[] args)