Package com.biglybt.core.util
Class BDecoder
- java.lang.Object
-
- com.biglybt.core.util.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.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
BDecoder.BDecoderInputStreamArray
static interface
BDecoder.MapDecodeListener
-
Field Summary
Fields Modifier and Type Field Description private boolean
force_utf8_keys
private byte[]
keyBytes
private java.nio.ByteBuffer
keyBytesBuffer
private int
keyBytesLen
private java.nio.CharBuffer
keyCharsBuffer
private java.nio.charset.Charset
keyCharset
private java.nio.charset.Charset
keyCharsetUTF8
private java.nio.charset.CharsetDecoder
keyDecoder
private java.nio.charset.CharsetDecoder
keyDecoderUTF8
private BDecoder.MapDecodeListener
mapDecodeListener
static int
MAX_BYTE_ARRAY_SIZE
private static int
MAX_MAP_KEY_SIZE
private static boolean
NEWDECODER_FOR_DEF_CHARSET
private char[]
numberChars
only create the array once per decoder instance (no issues with recursion as it's only used in a leaf method)private static byte[]
PORTABLE_ROOT
private boolean
recovery_mode
private static boolean
TRACE
private boolean
useNewDecoder
private boolean
verify_map_order
-
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 comparingjava.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)
-
-
-
Field Detail
-
MAX_BYTE_ARRAY_SIZE
public static final int MAX_BYTE_ARRAY_SIZE
- See Also:
- Constant Field Values
-
MAX_MAP_KEY_SIZE
private static final int MAX_MAP_KEY_SIZE
- See Also:
- Constant Field Values
-
NEWDECODER_FOR_DEF_CHARSET
private static final boolean NEWDECODER_FOR_DEF_CHARSET
-
TRACE
private static final boolean TRACE
- See Also:
- Constant Field Values
-
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
-
mapDecodeListener
private BDecoder.MapDecodeListener mapDecodeListener
-
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)
-
getMapDecodeListener
public BDecoder.MapDecodeListener getMapDecodeListener()
-
setMapDecodeListener
public void setMapDecodeListener(BDecoder.MapDecodeListener mapDecodeListener)
-
main
public static void main(java.lang.String[] args)
-
-