Advertisement
Chiddix

BencodeDecoder

Aug 23rd, 2014
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.35 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.  
  7. public final class BencodeDecoder {
  8.  
  9.     private static final Charset CHARSET = Charset.forName("US-ASCII");
  10.  
  11.     private final byte[] buffer;
  12.  
  13.     private int pos = 0;
  14.  
  15.     public BencodeDecoder(final InputStream inputStream) throws IOException {
  16.         buffer = new byte[inputStream.available()];
  17.         inputStream.read(buffer);
  18.     }
  19.  
  20.     public BencodeDecoder(final String string) {
  21.         buffer = string.getBytes(CHARSET);
  22.     }
  23.  
  24.     public BencodeDecoder(final byte[] bytes) {
  25.         buffer = bytes;
  26.     }
  27.  
  28.     public Object read() {
  29.         if (buffer[pos] >= '0' && buffer[pos] <= '9') {
  30.             return readString();
  31.         } else if (buffer[pos] == 'i') {
  32.             return readInteger();
  33.         }
  34.         throw new IllegalStateException("the byte " + buffer[pos] + " (char " + (char) buffer[pos] + ") is not a valid key");
  35.     }
  36.  
  37.     private int readInteger() {
  38.         final int start = ++pos;
  39.         while (buffer[pos] != 'e') {
  40.             pos++;
  41.         }
  42.         return Integer.parseInt(new String(buffer, start, pos++ - start, CHARSET));
  43.     }
  44.  
  45.     private String readString() {
  46.         final int start = pos++;
  47.         while (buffer[pos++] != ':') {
  48.         }
  49.         final String string = new String(buffer, pos, Integer.parseInt(new String(buffer, start, pos - start - 1, CHARSET)), CHARSET);
  50.         pos += string.length();
  51.         return string;
  52.     }
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement