我正在使用bencoding,我希望将bencoded字符串保留为Java字符串,但它们包含二进制数据,因此盲目地将它们转换为字符串将破坏数据。我正在尝试完成的是一个转换函数,它将保持ASCII字节为ASCII,并以可逆的方式编码非ASCII字符。
我已经找到了一些我试图用Python实现的示例,但我对Python的了解还不够深入。This decoder做的正是我想做的: torrent的ASCII部分保留为ASCII,但sha1散列打印为"\xd8r\xe7“。虽然我的Python知识非常有限,但他似乎并没有对字符串做任何特殊的处理;这是由Python解释器处理的吗?我能在Java中实现同样的功能吗?
我尝试过一些编码,如Base64或使用Integer.toHexString,但最终得到的ASCII码字符串无法读取。
我还发现了一个可以打印除sha1散列之外的所有内容的scheme example。
发布于 2009-11-03 06:31:40
本编码串是字节串。您可以尝试使用String(byte[] bytes, Charset charset)在Java语言中将字节字符串解码为unicode代码点。使用某些编码(如ISO-8859-1 )进行解码将始终成功,因为任何字节都会直接映射到码点。对于许多这样的编码(包括ISO-8859-1),这个过程也是可逆的。
发布于 2009-11-03 07:11:21
如果为Wikipedia is accurate on Bencode,则格式看起来足够简单。直接解析byte数据:
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"));
}
}https://stackoverflow.com/questions/1664124
复制相似问题