0

私が作っているトレントダウンロードシステム用のベンコーディングシステムを実装しています。

文字列のベンコーディングは非常に簡単です。たとえば「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));
}

それは機能しますが、私はそれがもっとうまくできると感じています。これを行うための最良の方法は何ですか?

注:文字列は任意のサイズにすることができます(したがって、文字列の前に1桁以上)

ここに返信してくれたみんなに感謝します:)

4

4 に答える 4

1

Java 文字列は Unicode 文字シーケンスを表します。エンコーディングの問題が発生するため、ベンコーディング/デコーディングに使用しないでください。

たとえば、辞書のキーは、文字列の並べ替えではなく、バイナリ表現で並べ替える必要があります。値には生のバイナリ (ハッシュなど) または utf-8 でエンコードされた文字列 (utf はバイト シーケンスが有効であるという制約を課します) を含めることができるため、ベンコードされたデータには固有の文字セットがありません。

代わりに、ByteBuffers またはプレーンな byte[] 配列を使用する必要があります。

于 2012-11-02T22:44:01.120 に答える
0

文字列の2つの側面を取得するには、 string.split( ":")を使用します...

次に、必要に応じて両方を解析します。

于 2012-09-15T23:16:43.490 に答える
0

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

それがあなたがする必要があるすべてです。すべてがに含まれているので、データのサイズはすでにわかっていますString

于 2012-09-15T23:18:41.680 に答える
0

次のようなものはどうですか:

public static BencodeString parseBencodeString(String string)
{
    int colon = string.indexOf(":");
    if(colon >= 0)
    {
        return new BencodeString(string.substring(colon+1));
    }
    return null;
}
于 2012-09-15T23:27:33.223 に答える