[Java] Bencoding:解码字符串

时间:2012-09-15 23:09:22

标签: java regex encoding bittorrent

我正在为我正在制作的torrent下载系统实现一个bencoding系统。

对字符串进行编码非常简单,你需要一个字符串,例如“hello”,然后通过编写字符串长度+一个':'字符对其进行编码,然后是字符串本身。 Bencoded“你好”将是“5:你好”

目前我正在使用此代码。

public BencodeString(String string) {
    this.string = string;
}

public static BencodeString parseBencodeString(String string) {
    byte[] bytes = string.getBytes();
    int position = 0;
    int size = 0;
    StringBuilder sb = new StringBuilder();
    while (bytes[position] >= '0' && bytes[position] <= '9') {
        sb.append((char) bytes[position]);
        position++;
    }
    if (bytes[position] != ':')
        return null;

    size = Integer.parseInt(sb.toString());
    System.out.println(size);
    if (size <= 0)
        return null;
    return new BencodeString(string.substring(position + 1, size + position
            + 1));
}

它有效,但我觉得它可以做得更好。做这个的最好方式是什么?

注意:字符串可以是任何大小(因此在字符串之前多于一位)

已经解决了,感谢所有回复的人:)

4 个答案:

答案 0 :(得分:1)

Java字符串表示Unicode字符序列。你不应该将它们用于bencoding / decode,因为你会遇到编码问题。

例如,字典键必须按其二进制表示排序,而不是按字符串排序。编码数据没有固有的字符集,因为值可以包含原始二进制(例如散列)或utf-8编码的字符串(utf限制哪些字节序列有效)。

您应该使用ByteBuffers或普通的byte []数组。

答案 1 :(得分:0)

使用string.split(":")以获取字符串的两边...

然后解析你想要的两个。

答案 2 :(得分:0)

string.substring(string.indexOf(':'))

这就是你需要做的一切。您已经知道了数据的大小,因为您拥有String

答案 3 :(得分:0)

如下:

public static BencodeString parseBencodeString(String string)
{
    int colon = string.indexOf(":");
    if(colon >= 0)
    {
        return new BencodeString(string.substring(colon+1));
    }
    return null;
}