【问题标题】:[Java]Bencoding: decoding string[Java]Bencoding:解码字符串
【发布时间】:2012-09-15 23:09:21
【问题描述】:

我正在为我正在制作的种子下载系统实现一个编码系统。

对字符串进行编码非常简单,您可以获取一个字符串,例如“hello”,然后通过编写字符串长度 + 一个 ':' 字符来对其进行编码,然后是字符串本身。编码后的“hello”将是“5:hello”

目前我正在使用此代码。

public BencodeString(String string) {
    this.string = string;
}

public static BencodeString parseBencodeString(String string) {
    byte[] bytes = string.getBytes();
    int position = 0;
    int size = 0;
    StringBuilder sb = new StringBuilder();
    while (bytes[position] >= '0' && bytes[position] <= '9') {
        sb.append((char) bytes[position]);
        position++;
    }
    if (bytes[position] != ':')
        return null;

    size = Integer.parseInt(sb.toString());
    System.out.println(size);
    if (size <= 0)
        return null;
    return new BencodeString(string.substring(position + 1, size + position
            + 1));
}

它有效,但我觉得它可以做得更好。做这个的最好方式是什么?

注意:字符串可以是任意大小(因此字符串前多于一位)

已经解决了,谢谢大家在这里回复:)

【问题讨论】:

  • 这听起来像是一个问题,在codereview.stackexchange.com 上会得到更好的回答
  • 您可以在扫描长度末尾时手动解析长度,这样可以避免构建一个您无论如何都要解析的新字符串
  • 你需要的是 String.indexOf 函数来找到:
  • @Edc String$indexOf 可以,谢谢

标签: java regex encoding bittorrent


【解决方案1】:

Java 字符串表示 Unicode 字符序列。您不应该将它们用于编码/解码,因为这样会遇到编码问题。

例如,字典键必须按其二进制表示排序,而不是按字符串排序。 Bencoded 数据没有固有的字符集,因为值可以包含原始二进制(例如哈希)或 utf-8 编码字符串(utf 对哪些字节序列有效进行限制)。

您应该改用 ByteBuffers 或普通 byte[] 数组。

【讨论】:

    【解决方案2】:

    string.substring(string.indexOf(':'))

    这就是你需要做的。您已经知道数据的大小,因为您将其全部保存在 String 中。

    【讨论】:

    • 不敢相信我没想到,哈哈,谢谢好先生。
    • 所以他甚至不需要 ":" 和之前的整数。他可以简单地把字符串本身。
    【解决方案3】:

    使用string.split(":") 来获取字符串的两侧...

    然后按你的意愿解析两者。

    【讨论】:

    【解决方案4】:

    怎么样:

    public static BencodeString parseBencodeString(String string)
    {
        int colon = string.indexOf(":");
        if(colon >= 0)
        {
            return new BencodeString(string.substring(colon+1));
        }
        return null;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 2012-10-24
      • 2023-04-04
      相关资源
      最近更新 更多