bencoding java字符串中的二进制数据

8qgya5xd  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(430)

我正在使用bencoding,我想将bencoded字符串保留为java字符串,但它们包含二进制数据,因此盲目地将它们转换为字符串将损坏数据。我试图实现的是一个转换函数,它将ascii字节保持为ascii,并以可逆的方式对非ascii字符进行编码。
我发现了一些我试图用python实现的示例,但我对python的了解还不够深入。这个解码器正是我想做的:torrent的ascii部分保持为ascii,但是sha1散列被打印为“\xd8r\xe7”。虽然我对python的了解非常有限,但他似乎并没有对字符串做任何特殊的处理;这是由python解释器处理的吗?我能用java实现同样的功能吗?
我玩过一些编码,比如base64或使用integer.tohexstring,但最后得到了不可读的ascii字符串。
我还发现了一个scheme示例,它打印除sha1散列以外的所有内容。

qyzbxkaa

qyzbxkaa1#

本编码字符串是字节字符串。您可以尝试用 String(byte[] bytes, Charset charset) . 使用某些编码(如iso-8859-1)进行解码总是会成功,因为任何字节都直接Map到一个码点。对于许多这样的编码(包括iso-8859-1),这个过程也是可逆的。

6kkfgxo0

6kkfgxo02#

如果wikipedia在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"));
  }
}

相关问题