我正在使用bencoding,我想保留bencoded字符串作为Java字符串,但它们包含二进制数据,所以盲目地将它们转换为字符串会破坏数据。我想要完成的是拥有一个转换函数,它将ASCII字节保持为ASCII并以可逆的方式编码非ASCII字符。
我已经找到了一些我想用Python完成的例子,但我不知道足够的Python来挖掘它们。 This decoder正是我想要做的:torrent的ASCII部分保留为ASCII,但sha1哈希打印为“\ xd8r \ xe7”。虽然我的Python知识非常有限,但他似乎并没有对字符串做任何特殊的事情;这是由Python解释器处理的吗?我可以在Java中完成同样的工作吗?
我玩过一些像Base64这样的编码或使用Integer.toHexString,但最后我得到了不可读的ASCII字符串。
我还发现了一个scheme example除了sha1哈希之外还打印了所有内容。
答案 0 :(得分:2)
Bencoded字符串是字节字符串。您可以尝试使用String(byte[] bytes, Charset charset)
将字节字符串解码为Java中的unicode代码点。使用某些编码(如ISO-8859-1)进行解码将始终成功,因为任何字节都直接映射到代码点。有许多这些编码(包括ISO-8859-1),这个过程也是可逆的。
答案 1 :(得分:0)
如果Wikipedia is accurate on Bencode,格式似乎很简单。直接解析字节数据:
while (true) {
in.mark(1);
int n = in.read();
if (n < 0) {
// end of input
break;
}
in.reset();
// take advantage of some UTF-16 values == ASCII values
if (n == 'd') {
// parse dictionary
} else if (n == 'i') {
// parse int
} else if (n >= '0' && n <= '9') {
// parse binary string
} else if (n == 'l') {
// parse list
} else {
throw new IOException("Invalid input");
}
将二进制字符串存储在一种类型中,只有在显式执行时才将它们转换为ASCII,如此toString
调用:
public class ByteString {
private final byte[] data;
public ByteString(byte[] data) { this.data = data.clone(); }
public byte[] getData() { return data.clone(); }
@Override public String toString() {
return new String(data, Charset.forName("US-ASCII"));
}
}