二进制数据中的Java字符串

2024-05-13 08:51:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我在玩bencoding,我希望将bencoded字符串保留为Java字符串,但是它们包含二进制数据,因此盲目地将它们转换为string会损坏数据。我试图实现的是有一个转换函数,它将ASCII字节保持为ASCII,并以可逆的方式对非ASCII字符进行编码。在

我发现了一些我试图用Python实现的示例,但是我对Python的了解还不够深入。This decoder做了我想做的事情:torrent的ASCII部分保留为ASCII,但是sha1散列被打印为“\xd8r\xe7”。虽然我对Python的知识非常有限,但他似乎对字符串没有做任何特殊的处理;这是由Python解释器处理的吗?我能用Java实现同样的功能吗?在

我玩过一些编码,比如Base64或using整数.toHexString,但最后我得到了无法读取的ASCII字符串。在

我还发现了一个scheme example,它可以打印除sha1哈希之外的所有内容。在


Tags: 数据函数字符串编码string字节方式ascii
2条回答

如果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调用中:

^{pr2}$

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

相关问题 更多 >