用Java字符串编码二进制数据

时间:2009-11-02 22:24:45

标签: java python encoding

我正在使用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哈希之外还打印了所有内容。

2 个答案:

答案 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"));
  }
}