我正在为我正在制作的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));
}
它有效,但我觉得它可以做得更好。做这个的最好方式是什么?
注意:字符串可以是任何大小(因此在字符串之前多于一位)
已经解决了,感谢所有回复的人:)
答案 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;
}