首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对Java字符串中的二进制数据进行bencoding

对Java字符串中的二进制数据进行bencoding
EN

Stack Overflow用户
提问于 2009-11-03 06:24:45
回答 2查看 2.1K关注 0票数 2

我正在使用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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-03 06:31:40

本编码串是字节串。您可以尝试使用String(byte[] bytes, Charset charset)在Java语言中将字节字符串解码为unicode代码点。使用某些编码(如ISO-8859-1 )进行解码将始终成功,因为任何字节都会直接映射到码点。对于许多这样的编码(包括ISO-8859-1),这个过程也是可逆的。

票数 2
EN

Stack Overflow用户

发布于 2009-11-03 07:11:21

如果为Wikipedia is accurate on Bencode,则格式看起来足够简单。直接解析byte数据:

代码语言:javascript
复制
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调用所示:

代码语言:javascript
复制
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"));
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1664124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档