Advertisement
Chiddix

BencodeDecoder v1.0.0

Aug 23rd, 2014
251
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.04 KB | None | 0 0
  1. package me.rabrg.bencode;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.nio.charset.Charset;
  6. import java.util.ArrayList;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10.  
  11. /**
  12.  *
  13.  * @author Ryan Greene
  14.  *
  15.  */
  16. public final class BencodeDecoder {
  17.  
  18.     private static final Charset CHARSET = Charset.forName("US-ASCII");
  19.  
  20.     private final byte[] buffer;
  21.  
  22.     private int pos = 0;
  23.  
  24.     public BencodeDecoder(final InputStream inputStream) throws IOException {
  25.         buffer = new byte[inputStream.available()];
  26.         inputStream.read(buffer);
  27.     }
  28.  
  29.     public BencodeDecoder(final String string) {
  30.         buffer = string.getBytes(CHARSET);
  31.     }
  32.  
  33.     public BencodeDecoder(final byte[] bytes) {
  34.         buffer = bytes;
  35.     }
  36.  
  37.     public Object read() {
  38.         if (buffer[pos] >= '0' && buffer[pos] <= '9') {
  39.             return readString();
  40.         } else if (buffer[pos] == 'i') {
  41.             return readInteger();
  42.         } else if (buffer[pos] == 'l') {
  43.             return readList();
  44.         } else if (buffer[pos] == 'd') {
  45.             return readMap();
  46.         }
  47.         throw new IllegalStateException("the byte " + buffer[pos] + " (char " + (char) buffer[pos] + ") is not a valid key");
  48.     }
  49.  
  50.     public String readString() {
  51.         final int start = pos++;
  52.         while (buffer[pos++] != ':') {
  53.         }
  54.         final String string = new String(buffer, pos, Integer.parseInt(new String(buffer, start, pos - start - 1, CHARSET)), CHARSET);
  55.         pos += string.length();
  56.         return string;
  57.     }
  58.  
  59.     public int readInteger() {
  60.         final int start = ++pos;
  61.         while (buffer[pos] != 'e') {
  62.             pos++;
  63.         }
  64.         return Integer.parseInt(new String(buffer, start, pos++ - start, CHARSET));
  65.     }
  66.  
  67.     public List<Object> readList() {
  68.         final List<Object> list = new ArrayList<Object>();
  69.         pos++;
  70.         while (buffer[pos] != 'e') {
  71.             final Object object = read();
  72.             list.add(object);
  73.         }
  74.         pos++;
  75.         return list;
  76.     }
  77.  
  78.     public Map<String, Object> readMap() {
  79.         final Map<String, Object> map = new HashMap<String, Object>();
  80.         pos++;
  81.         while (buffer[pos] != 'e') {
  82.             map.put(readString(), read());
  83.         }
  84.         pos++;
  85.         return map;
  86.     }
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement